我突然发现平时不太关心的WSASend却麻烦死我啦,WSARecv投递进IOCP后,能正常收到相应的通知!但是如果是阻塞发送,却会影响WSARecv通知,具体原因不得而知。
但是改用重叠IO投递,却能正常接收,我估计是发送时候,占用了所有太多时间,以至于没有接收消息的线程。
但是问题来了,WSASend什么时候接收通知呢?
有位兄弟进行了深入分析:http://blog.csdn.net/zy100/article/details/6205204
数据发送成功的含义(WSASend调用返回STATUS_SUCCESS或完成例程被调用或完成例程被调用或在完成端口上dequeue了一个完成包),可能情况:
1)数据被提交到tdi Client(AFD),就认为数据发送成功了
2)数据被提交到到tdi Server(如TCP),加入tcp的发生队列,就认为数据被发送成功了
3)数据被提交到网卡的发送缓冲区,就认为数据发送成功了
4)数据被网卡发送出去,就认为发送成功了
5)数据被对方成功接收,收到确认,就表示发送成功了。
以上情况到底属于那一种呢?按照MSDN的说法,发送请求被传输层消费掉了,就认为发送成功了,不知大家是如何理解这句话。
底层代码不得而知,但是根据我的实际测试情况,应该不是收到ACK包,为什么呢?我在收到完成通知消息以后,会连续发送数据包,会发现这段时间的数据异常的多,对方收到的也是异常多。基于这种情形,完全不适合只有发送的情况,因为数据会很快填充整个缓冲区。
我用WSASend采用阻塞的形式发送数据,也就是重叠那个参数填充NULL,为什么会影响WSARecv的接收通知呢?