大宝(sodme)的专栏

专注于高性能网络服务器技术研发,关注网游产品设计、研发、市场与运营的各个环节

用户操作
[即时聊天] [发私信] [加为好友]
大宝(sodme)ID:sodme
378186次访问,排名139好友275人,关注者308

倡导并实践着:
开发者应具备团队观和大产品观,崇尚实效至上的开发观,不唯技术论,不唯权威论,不畏惧任何困难,不丢下任一战友。

愿广泛结交同秉此理念的志同道合者,可以通过CSDN个人空间加我为好友,或者选择“关注”我。

我的网易博客:
http://sodme.dev.blog.163.com
GT&mail: sodme.dev#gmail.com
如要联系,请一律邮件。
sodme的文章
原创 132 篇
翻译 0 篇
转载 22 篇
评论 198 篇
大宝(sodme)的公告
我们的理念:
以市场作产品,以产品作技术。

1. 积极面对自己的工作和生活,是一种有百利而无一害的态度;

2. 不唯技术论,可以让你站在更高的层面去思考更多全局性的东西,而这些东西更直接地影响着产品成败和你个人的发展;

3. 我们希望的是,做一款成功的产品,而不仅仅是做一项成功的技术,如果技术与产品可以合起来当然更好,如果不能,那明智的选择当然是产品;

4. 知识型工作者,要学会自我管理,没有了自我管理,知识型工人可能连一个搬砖工人的价值都顶不上。

最近评论
zatman:谢谢,受益匪浅哈~~~
supperwfy:google的网络框架服务是其精髓。
fjfqslg:看了你的文章受益匪浅,谢谢你,^_^
kissnsms:众所周知,CreateIoCompletionPort函数,有两个作用,一是“创建”一个完成端口,二是将一个socket与已经创建的完成端口句柄相“绑定”,绑定之后,基于该socket的收、发、断开等事件都可以被完成端口感知。

请教一下,如何感知断开?在不进行数据的收发的情况下,谢谢!
rjchen:同意"持续更新, 持续开发, 持续改善能力"的观点,我们现在也在朝这个方向努力,由一个月发布一个新版本,到争取半个月发布一个新版本,到一周发布一个新版本,通过来提高用户的响应速度和体验。
文章分类
收藏
相册
_我的其它站
My GooglePages
My Maillist
My MsnSpace
我的网易博客
非技术
TechWeb
东方宽频
中国企业史
叶蓉
吴晓波
圈子-圈套
士兵突击
多玩网
李书文
王冉
蓝狮子
赢在中国
郎咸平
马未都
存档
订阅我的博客
XML聚合  FeedSky

转载 完成端口中WSAENOBUFS错误的解决方案收藏

新一篇: 完成端口的深入理解及一种变态用法 | 旧一篇: 请不要侮辱策划,尽管他们很可爱

摘自CSDN论坛

 一、 WSAENOBUFS 错误问题。

      这个问题通常很难靠直觉发现,因为当你第一次看见的时候你或许认为是一个内存泄露错误。假定已经开发完成了你的完成端口服务器并且运行的一切良好,但是当你对其进行压力测试的时候突然发现服务器被中止而不处理任何请求了,如果你运气好的话你会很快发现是因为WSAENOBUFS 错误而影响了这一切。

     每当我们重叠提交一个send或receive操作的时候,其中指定的发送或接收缓冲区就被锁定了。当内存缓冲区被锁定后,将不能从物理内存进行分页。操作系统有一个锁定最大数的限制,一旦超过这个锁定的限制,那么就会产生WSAENOBUFS 错误了。

     如果一个服务器提交了非常多的重叠的receive在每一个连接上,那么限制会随着连接数的增长而变化。如果一个服务器能够预先估计可能会产生的最大并发连接数,服务器可以投递一个使用零缓冲区的receive在每一个连接上。因为当你提交操作没有缓冲区时,那么也不会存在内存被锁定了。使用这种办法后,当你的receive操作事件完成返回时,该socket底层缓冲区的数据会原封不动的还在其中而没有被读取到receive操作的缓冲区来。此时,服务器可以简单的调用非阻塞式的recv将存在socket缓冲区中的数据全部读出来,一直到recv返回 WSAEWOULDBLOCK 为止。

    这种设计非常适合那些可以牺牲数据吞吐量而换取巨大并发连接数的服务器。当然,你也需要意识到如何让客户端的行为尽量避免对服务器造成影响。在上一个例子中,当一个零缓冲区的receive操作被返回后使用一个非阻塞的recv去读取socket缓冲区中的数据,如果服务器此时可预计到将会有爆发的数据流,那么可以考虑此时投递一个或者多个receive来取代非阻塞的recv来进行数据接收。(这比你使用1个缺省的8K缓冲区来接收要好的多。)

总结:

 解决方法一:

   投递使用空缓冲区的 recevie操作,当操作返回后,使用非阻塞的recv来进行真实数据的读取。因此在完成端口的每一个连接中需要使用一个循环的操作来不断的来提交空缓冲区的receive操作。

解决方法二:

 在投递几个普通含有缓冲区的recevie操作后,进接着开始循环投递一个空缓冲区的recevie操作。这样保证它们按照投递顺序依次返回,这样我们就总能对被锁定的内存进行解锁。

发表于 @ 2005年05月25日 23:42:00|收藏

新一篇: 完成端口的深入理解及一种变态用法 | 旧一篇: 请不要侮辱策划,尽管他们很可爱

评论:没有评论。

Csdn Blog version 3.1a
Copyright © 大宝(sodme)