社区
网络编程
帖子详情
WSARecv投递0字节缓冲区的问题
wfd123
2013-06-20 10:20:22
WSARecv投递一个长度为0的buf后,为什么非分页内存的大小还是会增加,另外锁定非分页内存是一个怎样的概念,求大神指导!
...全文
197
2
打赏
收藏
WSARecv投递0字节缓冲区的问题
WSARecv投递一个长度为0的buf后,为什么非分页内存的大小还是会增加,另外锁定非分页内存是一个怎样的概念,求大神指导!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
昨夜无风
2013-06-22
打赏
举报
回复
这是网上搜到的,LZ可以参考下:
无论是发还是收,一旦应用层内存被锁住,这块内存就不能从物理内存分页出去.操作系统会限制这些被锁住的内存的数量,一旦达到这个限制,就会返回WSAENOBUFS错误.如果应用层在每一个连接上发起大量重叠IO请求,随着连接数的增长,很可能就达到这个限制的值.一方面是因为重叠IO操作数量上的增长,另一方面是因为当前系统的分页单位是固定的,即使应用层只有一个字节的操作请求,操作系统仍然需要付出一页(一般是4K)的代价. 如果服务器希望能处理非常多并发连接,可以在每个连接的读请求时投递一个0字节的读操作,即在WSARecv的时候为lpBuffers和dwBufferCount分别传递NULL和0参数.这样做就不会存在内存锁定带来的资源紧张问题,因为没有内存需要被锁定,一旦有数据被收到,操作系统就会投递完成通知.这个时候服务端就可以去套接字接受缓冲区取数据了,有两种方法可以得知到底有多少数据可以读,一种是通过ioctlsocket结合FIONREAD参数去"查询",另一种就是一直读,直到得到WSAEWOULDBLOCK错误,就表示没有数据可读了.另一方面在发送数据的时候,仍然可以采用这种方案,原因在于对端的应用可能效率非常低下,或者陷入了某个死循环,导致对方的网络IO层迟迟不调用recv/WSARecv,受TCP协议本身的限制,服务端需要发送的数据就会一直PENDING,进而导致内存被内核锁住.采用0字节发送方式后,应用层先投递一个空的WSASend,表示希望发送数据,操作系统一旦判断这个连接可以写了,会投递一个完成通知,此时便可以放心投递数据,并且发送缓冲区的大小是可知的,不会存在内存锁定的问题.
http://www.haogongju.net/art/914537
wfd123
2013-06-21
打赏
举报
回复
给个思路也行额,不要沉了。
IOCP
投递
多个
WSA
Recv
存在的
问题
看完A simple IOCP Server/Client Class发现 IOCP
投递
多个
WSA
Recv
存在3个
问题
: 1. 多个pending
recv
,多个worker,数据包会乱序。 解决方法:可以通过给数据包加序号解决。但是不确定性能能提高多少,codeproject的作者对多worker的处理是只有一个pending
recv
2.多个pending
recv
,多个work...
WSA
Recv
()函数
WSA
Recv
()是从一个套接口接收数据的程序。主要用于在重叠模型中接收数据。 #include <winsock2.h> int
WSA
API
WSA
Recv
( SOCKET s, LP
WSA
BUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytes
Recv
d, LPINT lpFlags, LP
WSA
OVERLAPPED l
WSA
Recv
在重叠模型中,接收数据就要靠它了,它的参数也比
recv
要多,因为要用刀重叠结构嘛,它是这样定义的: int
WSA
Recv
( SOCKET s, // 当然是
投递
这个操作的套接字 LP
WSA
BUF lpBuffers, // 接收
缓冲区
,与
Recv
函数不同 // 这里需要一个由
WSA
BUF结构构成的数组 DWORD dwBufferCoun
零
字节
WSA
Send,
WSA
Recv
以下是Windows平台下两个函数的声明: int
WSA
Send( __in SOCKET s, __in LP
WSA
BUF lpBuffers, __in DWORD dwBufferCount, __out LPDWORD lpNumberOfBytesSent, __in
点译通-截屏悬停翻译软件
适合谁? 追生肉、啃外文文献、读海外网页/游戏/软件、处理外语截图资料的学生、上班族、设计师、跨境从业者。 一个鼠标,读懂全世界。 软件介绍: 1,全能悬停翻译:鼠标指到的地方,轻点一下Ctrl键,即刻出译文。网页、 PDF、客户端、图图片全覆盖,外语生肉秒变熟肉。 2,截屏取字OCR:一键截图 (Alt+x) 或导入图片,本地识别转文字,识别结果直接复制到剪贴板,料粘贴到JQQ/微信/文档即用 3,10+语种互译:中·英·日·韩·俄·德·法·西·越,翻译方向随心切换,中日、中韩、 日英互译都行。 4,离线也能用:OCR全程本地模型,不联网也能识别;翻译断网时自动切换离线词典兜底,关键时刻不掉链子。 5,轻量秒开:小巧桌面工具,常常驻不占资源,随取随用。 使用说明: 1,双击 悬停翻译软件.exe,就可以打开软件,使用翻译,识图,免费截图等功能。
网络编程
18,356
社区成员
64,161
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章