iocp中连续调用WSASend可以发送的最大字节数?

瀚海一漂 2015-07-02 12:33:29
在做iocp的实验,server端开一个Accept线程,接受客户端连接。本机cpu八核,开了一个work线程。测试客户端同时开1000个线程连接到server端。
server程序主要测试WSASend函数,在客户端连接上来之后,直接使用WSASend调用100次,向客户端发送数据(只是server端发送,client其实并不接收),
在客户端连入后,已经关闭了SO_SENDBUF发送缓冲区,基本上每一个WSASend都返回了SOCKET_ERROR,检测WSAGetLastError得到的是WSA_IO_PENDING,
实验结果是,连续使用WSASend是跟连续发送所有发送的字节数总大小有关系:
比如连续使用n次WSASend函数,而每次发送的WSABUF当中的buf大小指定为m字节。在本机测试n次WSASend都返回SOCKET_ERROR,错误原因是WSA_IO_PENDING,
但是只有之前的k(k<=n)次WSASend的所发送的总字节数(k*m字节)<=18608(逐步试验出来的),之前的都发送成功,且在work线程当中,GetQueuedCompletionStatus能够返回成功,
后续的WSASend全部在iocp上没有通知,GetQueuedCompletionStatus阻塞。继续等待客户端主动退出的时候,后续没有通知的(n-k)个WSASend返回socket错误。

基本上感觉莫名其妙,根据msdn上面的,进行很大size的WSASend,因为关闭了缓冲区,WSASend当中的缓冲区被锁定到非分页内存,连续WSASend可能导致缓冲区用尽
很多童鞋会返回WSA_NOBUF错误,进行很多次数后,根本不返回WSA_NOBUF。
对于连续WSASend是否有最大限制这种情况呢,未找到相关资料。
是否有大神碰到过呢,求指导。
...全文
225 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaozhiyong110 2015-07-02
  • 打赏
  • 举报
回复
引用 3 楼 jiqiang01234 的回复:
[quote=引用 2 楼 qhb3097 的回复:] [quote=引用 1 楼 jiqiang01234 的回复:] 既然选择重叠io发送数据,其一次最大的发送数据是不需要考虑的。只要发送时返回"未完成",就需要加入至发送队列,等待发送完毕后再从队列中取出数据,进行下一次发送
---------------------------------------------------------------无耻的分割线------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------- 现在的问题是,我连续调用很多次WSASend,对于这部分操作,基本上都以WSA_IO_PENDING返回了,按照你所说的应该就是加入了发送队列,等待发送。发送完成会通知到完成端口。 但是现在的问题是比如我连续10次使用WSASend之后都是一样未完成,但是只会有前3个投递的发送请求完成后通知到了完成端口,后续的发送全部没有通知返回了。 我直接接受了1000个客户端连接,这1000个客户端连接都是表现都是前3个投递发送请求完成通知到了IOCP,后续地都没反应了,我的问题是为何后续的那些请求没有通知返回了?[/quote] 我说的“发送队列”是自己定义的,不是指系统内部的缓冲区。 [/quote] 这说明你测试的 client的接收缓冲就差不多是你这里测试的18608字节 你client一直不接收 当然不可能无限制的保存发送过来的数据 所以后续的send返回的就是WSA_IO_PENDING这个错误
jiqiang01234 2015-07-02
  • 打赏
  • 举报
回复
引用 2 楼 qhb3097 的回复:
[quote=引用 1 楼 jiqiang01234 的回复:] 既然选择重叠io发送数据,其一次最大的发送数据是不需要考虑的。只要发送时返回"未完成",就需要加入至发送队列,等待发送完毕后再从队列中取出数据,进行下一次发送
---------------------------------------------------------------无耻的分割线------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------- 现在的问题是,我连续调用很多次WSASend,对于这部分操作,基本上都以WSA_IO_PENDING返回了,按照你所说的应该就是加入了发送队列,等待发送。发送完成会通知到完成端口。 但是现在的问题是比如我连续10次使用WSASend之后都是一样未完成,但是只会有前3个投递的发送请求完成后通知到了完成端口,后续的发送全部没有通知返回了。 我直接接受了1000个客户端连接,这1000个客户端连接都是表现都是前3个投递发送请求完成通知到了IOCP,后续地都没反应了,我的问题是为何后续的那些请求没有通知返回了?[/quote] 我说的“发送队列”是自己定义的,不是指系统内部的缓冲区。
瀚海一漂 2015-07-02
  • 打赏
  • 举报
回复
引用 1 楼 jiqiang01234 的回复:
既然选择重叠io发送数据,其一次最大的发送数据是不需要考虑的。只要发送时返回"未完成",就需要加入至发送队列,等待发送完毕后再从队列中取出数据,进行下一次发送
---------------------------------------------------------------无耻的分割线------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------- 现在的问题是,我连续调用很多次WSASend,对于这部分操作,基本上都以WSA_IO_PENDING返回了,按照你所说的应该就是加入了发送队列,等待发送。发送完成会通知到完成端口。 但是现在的问题是比如我连续10次使用WSASend之后都是一样未完成,但是只会有前3个投递的发送请求完成后通知到了完成端口,后续的发送全部没有通知返回了。 我直接接受了1000个客户端连接,这1000个客户端连接都是表现都是前3个投递发送请求完成通知到了IOCP,后续地都没反应了,我的问题是为何后续的那些请求没有通知返回了?
jiqiang01234 2015-07-02
  • 打赏
  • 举报
回复
既然选择重叠io发送数据,其一次最大的发送数据是不需要考虑的。只要发送时返回"未完成",就需要加入至发送队列,等待发送完毕后再从队列中取出数据,进行下一次发送

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧