IOCP中多次投递WSASend

本文探讨了在IOCP中使用WSASend时是否会出现部分发送的问题。通过实验和对Windows网络编程源码的分析,得出结论:WSASend在数据发送时通常会完整地提交到TCP发送队列,不会出现部分发送。除非在非重叠(non-overlapped)模式下,且发送缓冲不足时,send函数可能会部分发送。对于WSASend,即使缓冲区不足,也会等到所有数据发送完毕后才返回。这表明在IOCP中连续调用WSASend是安全的。
摘要由CSDN通过智能技术生成

      关于IOCP中是否可以对同一socket连续投递的疑问已经很久了,主要的疑问在wsaSend是否可以保证数据的完整发送,是否会出现部分发送成功的情况?

      网上大多数的建议都是WSASEND采用线性模式,即建立一个发送缓冲,当上一次send完成之后,再进行下一次的投递。那么WSASEND什么情况下会出现部分发送呢?

     在MSDN中IOCP的列子是对得到的发送的字节值进行了判断的,而在wsaSend函数的描述中也有这样一句:Note  The successful completion of a WSASend does not indicate that the data was successfully delivered.

   我首先想到的是当发送缓冲区不足的时候,会不会造成wsaSend部分发送返回。做了个实验,连续发送10M的数据(肯定大于缓冲区了)。第一次直接返回成功(对端并未进行Recv),第二次返回IO_PENDING.看来不是这样的。查了《windows 网络编程技术》其中有这样一段话:

    When an application makes a send call, if there is sufficient buffer space, the data is copied into the socket's send buffers, the call completes immediately with success, and the completion is posted. On the other hand, if the socket's send buffer is full, then the application's send buffer is locked and the send call fails withWSA_IO_PENDING. After the data in the send buffer is processed (for example, handed down to TCP for processing), then Winsock will process the locked buffer directly. That is, the data is handed directly to TCP from the application's buffer and the socket's send buffer is completely bypassed

   当发送缓冲不足的时候,会内存锁定,我另一端调用recv,收到wsasend的完成信号时,发送的字节数=要发送的字节数,并没有部分发送。

  下面是我网上找到的一片帖子忘了出自哪里了。

--------------------------------------------------------------------------------------------------------- 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值