难题!socket使用tcp连接超过1000个以后整个系统有问题了

jingtan 2012-06-21 07:35:27
程序创建并连接了1000个以上的SOCKET 以后, 新的连接可以创建, connect也可以连接得上, 就是不能收发数据. 而且WSASend和WSARecv 函数没有返回错误.

用网卡监视程序查到数据没有发送出去. 仔细看了看, 发起方只发送了一个封包数据(不确定是否已经被对方接收到), 也就是说三次握手还没完成.

此时, 整个系统都不能使用新的连接了, 浏览器, ping之类的都不能用. 但是之前创建的连接还能继续收发数据.

系统是xp sp2.

注1: MaxUserPort, MaxFreeTcbs 等注册表变量已经改过. 无效
注2: 应该不是半开连接数的问题.
注3: 不是内存不够, 除了不能使用网络, 系统运行还是很流畅的.

这是什么问题?


...全文
966 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2012-06-24
  • 打赏
  • 举报
回复
服务器版本显然更适合做这些.
smilestone322 2012-06-24
  • 打赏
  • 举报
回复
我在做socket recv的时候发现,recv接收速度很慢,接收100k的数据,要93ms,该怎么优化呢
fronz 2012-06-23
  • 打赏
  • 举报
回复
mark,xp果然不宜做大的网络服务用
jingtan 2012-06-23
  • 打赏
  • 举报
回复
换了2003的系统后没这个问题了. 可能是我机器装了一些乱七八糟的驱动或者xp有限制
jingtan 2012-06-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

太疯狂了,没用iocp?
[/Quote]
我用的是重叠模型. 试过select 也是同样的情况. 相信这不是网络模型的问题. 我程序的cpu和内存真用并不高.
很奇怪的是, 连接超过一定数量后, 就无法完成tcp握手过程了. 不知道是不是核心内存不够还是什么
ouyh12345 2012-06-22
  • 打赏
  • 举报
回复
太疯狂了,没用iocp?
xjtuzhw 2012-06-22
  • 打赏
  • 举报
回复
http://www.xueit.com/html/2010-09/103-20961491252010921140505515.html
最大TCP连接数
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
TcpNumConnections = 0x00fffffe (Default = 16,777,214)

以上注册表信息配置单机的最大允许的TCP连接数,默认为 16M。这个数值看似很大,这个并不是限制最大连接数的唯一条件,还有其他条件会限制到TCP 连接的最大连接数。
最大动态端口数
TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起3977 个Socket 连接。我们可以修改如下注册表来调整这个动态端口的范围
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxUserPort = 5000 (Default = 5000, Max = 65534)

最大TCB 数量
系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB),这个控制块用于缓存TCP连接的一些参数,每个TCB需要分配 0.5 KB的pagepool 和 0.5KB 的Non-pagepool,也就说,每个TCP连接会占用 1KB 的系统内存。
系统的最大TCB数量由如下注册表设置决定
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro = 1000, Srv=2000)
非Server版本,MaxFreeTcbs 的默认值为1000 (64M 以上物理内存)
Server 版本,这个的默认值为 2000。
也就是说,默认情况下,Server 版本最多同时可以建立并保持2000个TCP 连接。
最大TCB Hash table 数量
TCB 是通过Hash table 来管理的,下面注册表设置决定了这个Hash table 的大小
HKEY_LOCAL_MACHINE \System \CurrentControlSet \services \Tcpip \Parameters]
MaxHashTableSize = 512 (Default = 512, Range = 64-65536)
这个值指明分配 pagepool 内存的数量,也就是说,如果MaxFreeTcbs = 1000 , 则 pagepool 的内存数量为 500KB
那么 MaxHashTableSize 应大于 500 才行。这个数量越大,则Hash table 的冗余度就越高,每次分配和查找 TCP 连接用时就越少。这个值必须是2的幂,且最大为65536.

IBM WebSphere Voice Server 在windows server 2003 下的典型配置
这是IBM WebSphere Voice Server 的典型配置,大家可以做个参考。原文参见
IBM Web Sphere Voice Server 配置

MaxUserPort = 65534 (Decimal)
MaxHashTableSize = 65536 (Decimal)
MaxFreeTcbs = 16000 (Decimal)
这里我们可以看到 MaxHashTableSize 被配置为比MaxFreeTcbs 大4倍,这样可以大大增加TCP建立的速度。
hurryboylqs 2012-06-22
  • 打赏
  • 举报
回复
XP是不是有连接限制?你试试server 2003看下
steed_jet 2012-06-22
  • 打赏
  • 举报
回复
是否要多多设置什么信息例如发送接收缓冲区什么的?

18,356

社区成员

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

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