FD_READ: FD_READ 事件非常容易掌握. 当有数据发送过来时, WinSock会以FD_READ事件通知你, 对于每一个FD_READ事件,调用recv()即可读取到数据,如果传递给recv()的缓冲区不足以一次容纳所有数据,还有,不一定每一次调用recv()都会接收到一个完整的数据包, 因为数据可能不会一次性全部发送过来. 所以在开始处理接收到的数据之前, 最好对接收到的字节数(即recv()的返回值)进行判断,看看是否收到的是一个完整的数据包。如果传递给recv()的缓冲区不足以一次容纳所有数据,那系统会保持FD_READ事件(也就是再次设置对应的事件为激发状态),直到完全读取了所有接收到的数据为止。因此可以多次调用recv()函数进行数据的接收,避免多次向系统发生FD_READ事件通知,具体做法是:首先调用WSAEventSelect()函数,取消为该套接字祖册的网络事件。当该函数返回时,再调用WSAEventSelect()函数为该套接字注册FD_READ和FD_CLOSE网络事件。