因此,作为一个应用程序,自收到首条FD_WRITE消息开始,便应认为自己必然能在一 个套接字上发出数据,直至一个send、WSASend、sendto或WSASendTo返回套接字错误 WSAEWOULDBLOCK。经过了这样的失败以后,要再用另一条FD_WRITE通知应用程序再 次发送数据。
FD_READ事件触发条件: 1.在数据到达socket后,并且从来没有触发过FD_READ(也就是最开始的阶段) 2.在数据到达socket后,并且前一个recv()调用后 3.调用recv()后,缓冲区还有未读完的数据 FD_READ过程如下: 1.100 bytes 数据到达,winsock2发出FD_READ 2.程序用recv()只读入50 bytes,还剩下50 bytes 3.winsock2继续发出FD_READ消息 recv()返回WSAEWOULDBLOCK的情况: 1.有数据到达,FD_READ触发,该消息加入程序的消息队列 2.在还没处理该消息前,程序就把数据recv()了 3.等到处理该FD_READ消息时,程序调用recv()就会返回WSAEWOULDBLOCK(因为数据在这之前就recv()了) FD_READ注意: 1.winsock2发出一个FD_READ后,如果程序没有用recv(),即使还有数据没接收FD_READ也不会再触发另一个FD_READ,要等到recv()调用后FD_READ才会发出。 2.对一个FD_READ多次recv()的情形:如果程序对一个FD_READ多次recv()将会造成触发多个空的FD_READ,所以程序在第2次recv()前要关掉FD_READ(可以使用WSAAsynSelect关掉FD_READ),然后再多次recv()。3.recv()返回WSAECONNABORTED,WSAECONNRESET...等消息,可以不做任何处理,可以等到FD_CLOSE事件触发时再处理