完成端口中WSAENOBUFS错误的解决方案

转载 2005年05月25日 23:42:00

摘自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操作。这样保证它们按照投递顺序依次返回,这样我们就总能对被锁定的内存进行解锁。

IOCP中的socket错误和资源释放处理方法

本文作者:sodme, SeaWave 本文出处:http://blog.csdn.net/sodme                         http://blog.csdn.net/S...

setsocket用法大全(转自CSDN之gdy网友之作)

转贴自CSDN之gdy网友作品,特此感谢。原贴地址:http://community.csdn.net/Expert/topic/3592/3592436.xml?temp=.2238275不断的收到...
  • sodme
  • sodme
  • 2005年04月21日 22:25
  • 2674

当您尝试从 TCP 端口大于 5000 连接收到错误 ' WSAENOBUFS (10055) ' 2006/9/2 11:37:34

http://support.microsoft.com/?id=196271当您尝试从 TCP 端口大于 5000 连接收到错误 ' WSAENOBUFS (10055) '察看本文应用于的产品注意...
  • shybt
  • shybt
  • 2011年01月09日 14:10
  • 734

在Windows7下配置Apache2.4服务器及错误解决方案-通常每个套接字地址(协议/网络地址/端口)只允许使用一次

Apache2.4安装步骤: 1.下载Apache,官网(http://httpd.apache.org/) 以Apache Haus为例,下载地址(http://www.apachehaus.com...

myeclipse连接SQL2005以及碰到TCP/IP端口连接错误解决方案

最近在用myeclipse连接SQL2005进行开发,碰到了TCP/IP端口连接失败问题。原先我以为是SQL2005驱动包下载错误,导致数据库服务未开启。 后来在网上找了资料,原来架包没有错。只是我...
  • pandana
  • pandana
  • 2012年03月31日 16:11
  • 1546

“通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败“常见问题的解决方案

Java通过JDBC连接SQLServer 2012,出现一些连接问题,从网上查找了很多解决方法,却仍然无法解决。在这里将我遇到的问题及解决方法总结如下,希望可以帮到大家。 1、通过端口 1433 连...

Java开发常见错误及解决方案文件

  • 2015年08月15日 10:26
  • 270KB
  • 下载

HP打印机安装错误解决方案

  • 2015年05月10日 23:30
  • 2.23MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:完成端口中WSAENOBUFS错误的解决方案
举报原因:
原因补充:

(最多只允许输入30个字)