社区
网络编程
帖子详情
请教IOCP,connectex返回WSA_IO_PENDING,是不是就可以投递WSARECV了?
zneil
2012-06-11 10:43:13
如题
...全文
345
3
打赏
收藏
请教IOCP,connectex返回WSA_IO_PENDING,是不是就可以投递WSARECV了?
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
f_tomorrow
2012-06-11
打赏
举报
回复
1:在IOCP中投递WSASend返回WSA_IO_PENDING的时候,表示异步投递已经成功,但是稍后发送才会完成。这其中涉及到了三个缓冲区。
网卡缓冲区,TCP/IP层缓冲区,程序缓冲区。
情况一:调用WSASend发送正确的时候(即立即返回,且没有错误),TCP/IP将数据从程序缓冲区中拷贝到TCP/IP层缓冲区中,然后不锁定该程序缓冲区,由上层程序自己处理。TCP/IP层缓冲区在网络合适的时候,将其数据拷贝到网卡缓冲区,进行真正的发送。
情况二:调用WSASend发送错误,但是错误码是WSA_IO_PENDING的时候,表示此时TCP/IP层缓冲区已满,暂时没有剩余的空间将程序缓冲区的数据拷贝出来,这时系统将锁定用户的程序缓冲区,按照书上说的WSASend指定的缓冲区将会被锁定到系统的非分页内存中。直到TCP/IP层缓冲区有空余的地方来接受拷贝我们的程序缓冲区数据才拷贝走,并将给IOCP一个完成消息。
情况三:调用WSASend发送错误,但是错误码不是WSA_IO_PENDING,此时应该是发送错误,应该释放该SOCKET对应的所有资源。
2:在IOCP中投递WSARecv的时候,情况相似。
情况一:调用WSARecv正确,TCP/IP将数据从TCP/IP层缓冲区拷贝到缓冲区,然后由我们的程序自行处理了。清除TCP/IP层缓冲区数据。
情况二:调用WSARecv错误,但是返回值是WSA_IO_PENDING,此时是因为TCP/IP层缓冲区中没有数据可取,系统将会锁定我们投递的WSARecv的buffer,直到TCP/IP层缓冲区中有新的数据到来。
情况三:调用WSARecv错误,错误值不是WSA_IO_PENDING,此时是接收出错,应该释放该SOCKET对应的所有资源。
在以上情况中有几个非常要注意的事情:
系统锁定非分页内存的时候,最小的锁定大小是4K(当然,这个取决于您系统的设置,也可以设置小一些,在注册表里面可以改,当然我想这些数值微软应该比我们更知道什么合适了),所以当我们投递了很多WSARecv或者WSASend的时候,不管我们投递的Buffer有多大(0除外),系统在出现IO_PENGDING的时候,都会锁定我们4K的内存。这也就是经常有开发者出现WSANOBUF的情况原因了。
我们在解决这个问题的时候,要针对WSASend和WSARecv做处理
1:投递WSARecv的时候,可以采用一个巧妙的设计,先投递0大小Buf的WSARecv,如果返回,表示有数据可以接收,我们开启真正的recv将数据从TCP/IP层缓冲区取出来,直到WSA_IO_PENGDING.
2:对投递的WSARecv以及WSASend进行计数统计,如果超过了我们预定义的值,就不进行WSASend或者WSARecv投递了。
3:现在我们应该就可以明白为什么WSASend会返回小于我们投递的buffer空间数据值了,是因为TCP/IP层缓冲区小于我们要发送的缓冲区,TCP/IP只会拷贝他剩余可被Copy的缓冲区大小的数据走,然后给我们的WSASend的已发送缓冲区设置为移走的大小,下一次投递的时候,如果TCP/IP层还未被发送,将返回WSA_IO_PENGDING。
4:在很多地方有提到,可以关闭TCP/IP层缓冲区,可以提高一些效率和性能,这个从上面的分析来看,有这个可能,要实际的网络情况去实际分析了。
zhengjiankang
2012-06-11
打赏
举报
回复
GetQueuedCompletionStatus 返回了 ConnectEx 的请求才可以发送吧。
zneil
2012-06-11
打赏
举报
回复
沉了?
Socket编程系列之6:Libuv高性能异步
IO
及高效网络编程
---------------------------------------------------Socket编程系列之6:Libuv高性能异步
IO
及高效网络编程 Libuv是一个高效的异步
IO
开发库,Linux下采取libev,Windows下独立编程实现
IO
C
P高效网络编程。...
完成端口模型
IO
C
P详解 (一)
"
WSA
GetLastError() == ERROR_
IO
_PENDING/n" ); // 操作正在进行中 } } return TRUE ; } // 在这个函数中重点是 ...
boost.as
io
学习笔记05——as
io
的windows实现
Operat
io
n 还记得前面我们在分析resolver的实现的时候,挖了...和前面提到过的service的类似,这里的operat
io
n也分为两大系:
IO
C
P Enable和Disable系列。这里我们重点关注下图中红色部分表示的
IO
C
P Enable系列oper
IO
C
P相关问题和解决方案
IO
C
P 中的一些问题 1.连接建立 同步accept的问题是在连接建立时创建socket,对于大量连接同时建立的处理存在瓶颈。异步的accep
tex
可以预先创建好socket,等到连接建立时为连接分配一个socket,不存在同步情况下的...
IO
C
P是一整套高性能的
IO
操作异步模型
IO
C
P是一整套高性能的
IO
操作异步模型,可以用在文件操作也可以用在网络SOCKET操作上面。当用在网络SOCKET上时,在服务器端主要配合Aceep
tEx
WSA
Send
WSA
Sendto来使用,在客户机端主要配合
Connec
tEx
WSA
Recv
和...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章