首页 新闻 会员 周边

求助,关于socket短连接

0
悬赏园豆:30 [已解决问题] 解决于 2011-12-22 16:43

最近做一个项目,因为用户的数量会很大,所以客户端采用的是短连接,及每次请求得到数据后就关闭连接。现在的问题是,测试的时候,循环请求数据,短时间内正常,但过了几个小时就会出现SOCKET连接错误,而且一旦出现,频率就会越来越高。请高人指点。

异常信息为:“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败”

问题补充:

这种错误好像只在外网通讯时才出现,内网没出过错。改用长连接的话,内外网都正常

逸*风的主页 逸*风 | 初学一级 | 园豆:125
提问于:2011-12-20 17:26
< >
分享
最佳答案
0

修改注册表,主要是下面几个

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
TcpNumConnections = 0x00fffffe
MaxUserPort=65535

收获园豆:15
Greatest | 小虾三级 |园豆:678 | 2011-12-20 20:03

我也怀疑过可能跟端口有关,不过出错后我重新连接还是没有问题,如果是端口不够用的话,应该会连续报错吧。而且就算是端口不够用了,这种该注册表的办法也是治标不治本啊

逸*风 | 园豆:125 (初学一级) | 2011-12-20 20:16

@逸*风: 默认情况下只会使用5000一下端口,close之后的socket也会有一段时间处于timewait状态占着端口的。用tcpview看一下,所有的端口是不是都是5000一下的。

Greatest | 园豆:678 (小虾三级) | 2011-12-21 13:32

@Greatest: 对,是只有大概5000个左右是系统分配的端口,不过我用netstat看了一下,处于timewait状态的端口只有20个左右

逸*风 | 园豆:125 (初学一级) | 2011-12-21 13:48
其他回答(1)
0

首先,断开的时候,你要确定调用了CloseSocket这个函数(是不是叫这个名称我忘记了,总之就是关了Socket连接)
其次,这个关闭连接并不会立刻释放Socket所占用的端口,有一个系统的Timer参数,在过了这个Timer时间以后,这个Socket才会真的被释放.

从上面两点来入手试着找一下解决方案.

收获园豆:15
莫压枯枯地 | 园豆:220 (菜鸟二级) | 2011-12-21 08:57

首先,close是确定调用了,我在服务端有监控连接数,连接一直是一个,只有端口号在变。端口释放的话,我测试的时候操作间隔至少2秒,而端口有6万多个,等我用到6万多个的时候,前面用过的端口怎么也该释放完了吧,所以我偏向于问题不是出在端口上

支持(0) 反对(0) 逸*风 | 园豆:125 (初学一级) | 2011-12-21 09:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册