### Winsock函数详解 #### Winsock概述 Winsock(Windows Sockets)是微软为Windows操作系统设计的一套网络编程接口标准,它提供了与Berkeley Sockets兼容的API集合,使得开发者能够在Windows平台上开发出功能丰富的网络应用程序。Winsock自1993年发布以来,经历了多个版本的发展,主要包括Winsock 1.1 和 Winsock 2。 #### Winsock版本及头文件引用 - **Winsock 1.1**:该版本提供了基础的网络编程功能,包括TCP/IP协议的支持。为了使用Winsock 1.1进行编程,需要在程序中包含`WINSOCK.H`头文件,并链接`WSOCK32.LIB`库文件。 - **Winsock 2**:随着Windows操作系统的不断升级,Winsock 2应运而生,它在Winsock 1.1的基础上增加了更多的功能,如异步通知、多播等。使用Winsock 2时,需要包含`WINSOCK2.H`头文件,并链接`WS2_32.LIB`库文件。 - **MSWSOCK.H**:这个头文件主要用于支持Windows平台上的高性能网络程序,提供了对某些特定API的支持,若使用其中的扩展API,则需链接`MSWSOCK.LIB`库文件。 #### BSD Socket API Winsock基于Berkeley Software Distribution (BSD) Socket API,它定义了一系列用于网络通信的基本函数。这些函数包括: - **accept()**:用于服务器端接收客户端的连接请求。当服务器通过调用`listen()`函数准备好接收连接后,可以通过`accept()`接受来自客户端的连接。此函数返回一个新的套接字描述符,用于后续的通信。 - **bind()**:将套接字与本地地址(IP地址和端口号)绑定。此函数需要指定套接字描述符、地址结构体指针和地址长度。成功绑定后,其他主机才能通过指定的地址来访问该套接字。 - **closesocket()**:关闭一个已打开的套接字。此函数可以释放与套接字相关的资源。 - **connect()**:客户端使用此函数与服务器建立连接。它需要提供服务器的地址和端口信息。 - **getpeername()**:获取与套接字相连的远程主机的信息。 - **getsockname()**:获取本机上套接字的本地地址信息。 - **getsockopt()**:设置或获取套接字选项。 - **htonl()**/`htons()`:将主机字节序转换为网络字节序。 - **inet_addr()**:将点分十进制的IP地址转换为网络字节序的32位整数形式。 - **ioctlsocket()**:用于控制套接字的一些特殊行为。 - **listen()**:服务器端使用此函数监听连接请求。 - **ntohl()**/`ntohs()`:将网络字节序转换为主机字节序。 - **recv()**/**recvfrom()**:从套接字接收数据。 - **select()**:监控多个套接字的状态变化,通常用于实现非阻塞I/O模型。 - **send()**/**sendto()**:向套接字发送数据。 - **setsockopt()**:设置套接字选项。 - **shutdown()**:关闭套接字的读写功能之一。 - **socket()**:创建一个新的套接字。 #### Microsoft Windows-specific Extensions 除了上述标准的BSD Socket API外,Winsock还提供了一些针对Windows平台的扩展API,这些API有助于开发者利用Windows特有的功能来优化网络应用程序。例如: - **WSAAsyncGetHostByAddr()**/**WSAAsyncGetHostByName()**:异步获取主机信息。 - **WSAAsyncGetProtoByName()**/**WSAAsyncGetProtoByNumber()**:异步获取协议信息。 - **WSAAsyncGetServByName()**/**WSAAsyncGetServByPort()**:异步获取服务信息。 - **WSAAsyncSelect()**:用于设置异步事件的通知方式。 - **WSACancelAsyncRequest()**:取消异步操作请求。 - **WSACancelBlockingCall()**:取消阻塞调用。 - **WSACleanup()**:清理Winsock DLL。 - **WSAGetLastError()**:获取上次Winsock调用失败的原因。 - **WSAIsBlocking()**:检查当前套接字是否处于阻塞模式。 - **WSASetBlockingHook()**/**WSAUnhookBlockingHook()**:设置/取消阻塞模式的回调函数。 - **WSAStartup()**:初始化Winsock DLL。 #### Socket Types and Modes Winsock支持多种类型的套接字,包括Stream (TCP)和Datagram (UDP)两种主要类型。每种类型都有其特点和适用场景: - **Stream (TCP)**:提供面向连接的服务,保证数据按顺序无差错地传输。 - **Datagram (UDP)**:提供无连接的服务,数据传输不保证顺序性和完整性,但效率较高。 在使用Winsock进行网络编程时,还需要选择合适的I/O模型,主要有阻塞模式(Blocking)和非阻塞模式(Non-blocking)两种: - **阻塞模式**:当执行网络操作时,进程会被阻塞直到操作完成。这是一种较为简单的模型,但可能会导致应用程序响应变慢。 - **非阻塞模式**:当执行网络操作时,进程不会被阻塞,而是立即返回。这种模式下,通常需要使用其他机制来检测操作何时完成,如`select()`函数或者Windows的异步通知机制。 Winsock为Windows平台提供了强大的网络编程能力,通过灵活运用各种API和I/O模型,开发者可以构建高效稳定的网络应用程序。在实际开发过程中,根据具体的应用需求选择合适的Winsock版本和API是非常重要的。
Winsock函数参考手册
本系统(WinKing)提供之 Windows Sockets API 介面乃是依照 1993年1月20日
公布之 WINSOCK 第1.1版(如附录)中所定义之函式 (routine); 包括了30个
Berkeley Software Distribution (BSD) 的函式以及16个符合 Windows
Message-driven 特性的函式。
BSD 函式包括:
accept() bind() closesocket() connect()
getpeername() getsockname() getsockopt() htonl()
htons() inet_addr() inet_ntoa() ioctlsocket()
listen() ntohl() ntohs() recv()
recvfrom() select() send() sendto()
setsockopt() shutdown() socket() gethostname()
gethostbyaddr() gethostbyname()
getprotobyname() getprotobynumber()
getservbyname() getservbyport()
Microsoft Windows-specific Extensions 函式包括:
WSAAsyncGetHostByAddr() WSAAsyncGetHostByName()
WSAAsyncGetProtoByName() WSAAsyncGetProtoByNumber()
WSAAsyncGetServByName() WSAAsyncGetServByPort()
WSAAsyncSelect() WSACancelAsyncRequest()
WSACancelBlockingCall() WSACleanup()
WSAGetLastError() WSAIsBlocking()
WSASetBlockingHook() WSASetLastError()
WSAStartup() WSAUnhookBlockingHook()
这些 API 介面适用於 Internet Protocol Suite (IPS,通常称之为 TCP/IP),
支援 Stream (TCP) 及 Datagram (UDP) Socket。
Stream (TCP) Socket 提供「双向」、「可靠」、「有次序」、「不重覆」
之资料传送。
Datagram (UDP) Socket 则提供「双向」之沟通,但没有「可靠」、「有次
序」、「不重覆」等之保证; 所以使用者可能会收到无次序、重覆之资料,
甚至资料在传输过程中也可能会遗漏。
[Blocking 与 Non-blocking 模式]
Blocking 模式:使用者呼叫此一模式之函式时,会进入此函式之内部,直到
条件或资料完全符合时再回到呼叫点。
Non-blocking 模式:使用者呼叫此一模式之函式时,进入此函式之内部,
依当时之条件或资料做适当之回覆,并不会停留在函式之内部到条件或资料
完全符合後才回应。
使用者必需注意的是,WINSOCK 定义之 Blocking 模式与一般 Unix 的不太相
同。WINSOCK定义允许应用程式在呼叫 Blocking 函式的同时,依旧能够处理其
它讯息 (Messages),包括Keyboard 及 Mouse 的事件;但是此时应用程式除了
能用 WSACancelBlockingCall() 函式来取消原先之 locking 动作或用
WSAIsBlocking() 函式来检查目前是否有 Blocking 动作仍在进行外,
「不可以」在原先呼叫之 Blocking 函式完成前再呼叫其它的 Socket 函式,
不然後者会失败且产生WSAINPROGRESS 的错误。
使用者呼叫 WSACancelBlockingCall()函式所取消的 Blocking 动作若不是
accept() 或者 select()的话,那麽之後唯一可呼叫的 Socket 函式只有
closesocket(),因为取消一个 Socket 的Blocking 动作会使其变成未定
剩余22页未读,继续阅读
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页