WSASend

我突然发现平时不太关心的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的接收通知呢?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值