WinSock 基本知识 这里不打算系统地介绍socket 或者WinSock 的知识。首先介绍WinSock API 函数,讲解阻塞/非阻塞的概念;然后介绍socket 的使用。 1. WinSock API Socket 接口是网络编程(通常是TCP/IP 协议,也可以是其他协议)的API。最早的Socket 接口是Berkeley接口,在Unxi 操作系统中实现。WinSock 也是一个基于Socket 模型的API,在Microsoft Windows 操作系统类中使用。它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows 扩展函数。Winscok1.1 只支持TCP/IP 网络,WinSock2.0 增加了对更多协议的支持。这里,讨论TCP/IP 网络上的API。 Socket 接口包括三类函数: 第一类是WinSock API 包含的Berkeley socket 函数。这类函数分两部分。第一部分是用于网络I/O 的函数,如 accept、Closesocket、connect、recv、recvfrom、Select、Send、Sendto 另一部分是不涉及网络I/O、在本地端完成的函数,如 bind、getpeername、getsockname、getsocketopt、htonl、htons、inet_addr、inet_nton ioctlsocket、listen、ntohl、ntohs、setsocketopt、shutdow、socket 等 第二类是检索有关域名、通信服务和协议等 Internet 信息的数据库函数,如 gethostbyaddr、gethostbyname、gethostname、getprotolbyname getprotolbynumber、getserverbyname、getservbyport。 第三类是Berkekley socket例程的Windows专用的扩展函数,如gethostbyname对应的WSAAsynGetHostByName(其他数据库函数除了gethostname 都有异步版本),select 对应的WSAAsynSelect,判断是否阻塞的函数WSAIsBlocking,得到上一次Windsock API 错误信息的WSAGetLastError,等等。 从另外一个角度,这些函数又可以分为两类,一是阻塞函数,一是非阻塞函数。所谓阻塞函数,是指其完成指定的任务之前不允许程序调用另一个函数,在Windows 下还会阻塞本线程消息的发送。所谓非阻塞函数,是指操作启动之后,如果可以立即得到结果就返回结果,否则返回表示结果需要等待的错误信息,不等待任务完成函数就返回。 首先,异步函数是非阻塞函数; 其次,获取远地信息的数据库函数是阻塞函数(因此,WinSock 提供了其异步版本); 在Berkeley socket 函数部分中,不涉及网络I/O、本地端工作的函数是非阻塞函数; 在Berkeley socket 函数部分中,网络I/O 的函数是可阻塞函数,也就是它们可以阻塞执行,也可以不阻塞执行。这...