TCP服务端口怎么突然之间不接受任何新连接?

cnwolfs 2012-04-21 10:06:23
TCP服务端口怎么突然之间不接受任何新连接?

查了已经连接的可以正常通讯,新连接连不上来,已经连接的连接数就1个。

为啥?

我用Telnet到那个端口直接告诉我连不上。

TcpSvr使用的是这个:
http://hi.baidu.com/%D4%C2%CA%CF%C8%CB/blog/item/22d358545bf2825a574e00c4.html

...全文
874 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnwolfs 2012-05-04
  • 打赏
  • 举报
回复
问题已经确定了,是半连接导致的,之所以导致产生半连接,是因为有某些终端处在WiFi的信号很差的环境下工作,而XP只允许10半连接个连接。
段传涛 2012-04-22
  • 打赏
  • 举报
回复
我上次 遇到这个问题 是因为端口 被限制了。
取消限制就ok了。
我是在亚马逊购买的 EC2 购买的 虚拟空间 供国外的人访问。
cnwolfs 2012-04-22
  • 打赏
  • 举报
回复
  2、防止SYN洪水攻击 (ps: SYN http://baike.baidu.com/view/488528.htm)
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  新建DWORD值,名为SynAttackProtect,值为2
  新建EnablePMTUDiscovery REG_DWORD 0
  新建NoNameReleaseOnDemand REG_DWORD 1
  新建EnableDeadGWDetect REG_DWORD 0
  新建KeepAliveTime REG_DWORD 300,000
  新建PerformRouterDiscovery REG_DWORD 0
  新建EnableICMPRedirects REG_DWORD 03. 禁止响应ICMP路由通告报文
  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\interface
  新建DWORD值,名为PerformRouterDiscovery 值为0


查了好多网站,都提到Windows 2000和Windows 2003注册表中有这些键值,结果我在注册表中都没找到这些键值,到底怎么回事?


查了一篇网文介绍,Win 2000 Server的半连接数是80个,Win2000 Advanced server为400,是否可以猜想Win 2003企业版会有超过400?
Linux、Unix半连接的超时为3分钟,Windows也差不多是3分钟吧,我的客户端尝试重新连接的概率是5秒,连接超时设定为3秒,也就是重复连接最短时间是8秒,这些参数是可以配置的,不过用户一般都用默认值,没有重新配置。若是400个半连接的话,最坏情况下,可以允许17台终端有这个问题,从WiFi连接质量上来说,发生这样问题的概率可能会有20%(从直觉上判断),也就是可以有85台终端的使用量。希望今天不会有半连接问题发生了。

彻底解决的办法还是能够找到由服务程序根据特定规则清除半连接的做法,退而求其次是缩短半连接超时时间和提高半连接数量。最好是服务器更牛逼点。
qldsrx 2012-04-22
  • 打赏
  • 举报
回复
你应该自己断点调试,没有报错的话,说明是某个地方阻塞或者直接运行到了return造成的,只能自己调试才行。
yzlyboy 2012-04-22
  • 打赏
  • 举报
回复
报啥错误啊,是timeout,还http://topic.csdn.net/u/20120421/10/ce509e5a-13a5-4a2c-8536-131045994cb1.html?91300#r_achor是只能建立一次连接,还是权限的问题呢
cnwolfs 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
http://topic.csdn.net/u/20120421/19/109b47c9-60d5-40c5-992b-8c7fd271f9d9.html?seed=1589787366&r=78330700#r_78330700
[/Quote]


感觉跑题了不少,我并不是不会写TCP 啥的,是现在出了莫名奇妙的问题,在异步方式中,我用到的这个Class应该是功能最完整的Class了。网络上搜索,不出其左右。

现在遇到的问题,我归结为半连接。
如何排除半连接的产生,或者如何通过程序消除半连接,或者缩小半连接的超时时间应该是解决的办法。
当然,今天我将会用一台服务器来测试,估计半连接产生的情况会减少。


rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20120421/19/109b47c9-60d5-40c5-992b-8c7fd271f9d9.html?seed=1589787366&r=78330700#r_78330700
rayyu1989 2012-04-22
  • 打赏
  • 举报
回复
既然你说没有人写的能出其右 又怎么会出现半连接bug呢
cmd netstat -an 看看你监听的端口 是不是用一段时间 被挤爆了
如果是 那就是关闭连接的操作没处理好
如果不是 那就不鸡到了
[Quote=引用 14 楼 的回复:]

引用 13 楼 的回复:
http://topic.csdn.net/u/20120421/19/109b47c9-60d5-40c5-992b-8c7fd271f9d9.html?seed=1589787366&r=78330700#r_78330700



感觉跑题了不少,我并不是不会写TCP 啥的,是现在出了莫名奇妙的问题,在异步方式中,我用到的这个Class……
[/Quote]
足球中国 2012-04-22
  • 打赏
  • 举报
回复
楼上的不错。可能是原因之一。
anzhiqiang_touzi 2012-04-21
  • 打赏
  • 举报
回复
服务器有特殊限制吗,限制端口连接数
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
端口连接数限制是1000,应该是没超吧,当前活跃的连接数是1,。。。。。
[/Quote]

超什么指标呢?

.net封装得非常好的TcpListener类,其连接数是int.MaxValue。

.net开发人员不傻,而且这个类肯定经过大量工程测试,这说明他们测试结果为这个数作为默认值比较好。
  • 打赏
  • 举报
回复
就是没有执行 Accept(或者BeginAccept)语句呗。

看看你自己的程序逻辑,以及日志。

服务端与客户端不同,服务器端在实际正式上线时其try...catch是静默的(顶多记录下日志)。有时候你先处理Receicve,然后才继续下一个Accept,结果自己的代码原因会造成:因为Receive异常了可能就没有执行下面的Accept。
cnwolfs 2012-04-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
服务器有特殊限制吗,限制端口连接数
[/Quote]

端口连接数限制是1000,应该是没超吧,当前活跃的连接数是1,这是我在程序中对每个连接计数得来的数字,就是增加一个连接加1,断开一个连接减一,客户端连接不上会重连,有一个可能性是连接的时候没成功,也就是没触发mTcpSvr_ClientConn事件的情况下没有计数。
bdmh 2012-04-21
  • 打赏
  • 举报
回复
服务器有特殊限制吗,限制端口连接数
cnwolfs 2012-04-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
http://blog.csdn.net/fengyarongaa/article/details/6631953
[/Quote]

你的意思是这个例程不会拒绝服务吗?
orochiheart 2012-04-21
  • 打赏
  • 举报
回复
关注!
参考:
http://topic.csdn.net/u/20080623/08/4bbd2475-45f1-42e3-a613-16b094759ade.html?31411
http://topic.csdn.net/u/20080619/08/dcef3fe2-f95b-4918-8edb-36d48a3d0528.html?15470
rayyu1989 2012-04-21
  • 打赏
  • 举报
回复
Accept 的 异步回调里 马上再重新调用Accept托管

然后才开始处理接收这次accept里的连接数据
cnwolfs 2012-04-21
  • 打赏
  • 举报
回复
socket系统调用listen只被tcp 服务器使用,他做两件事:
1. 将未链接的套接口转换为被动套接口,指示内核接受向此套接口的连接请求,调用此系统调用后tcp 状态机有close转换到listen.
2.第二个参数制定了内核为此套接口排队的最大连接个数。
关于第二个参数,对于给定的监听套接口,内核要维护两个队列,未链接队列和已连接队列,根据tcp 三路握手过程中三个分节来分隔这两个队列。
服务器处于listen状态时收到客户端syn 分节(connect)时在未完成队列中创建一个新的条目,然后用三路握手的第二个分节即服务器的syn 响应及对客户端syn的ack,此条目在第三个分节到达前(客户端对服务器syn的ack)一直保留在未完成连接队列中,如果三路握手完成,该条目将从未完成连接队列搬到已完成连接队列尾部。当进程调用accept时,从已完成队列中的头部取出一个条目给进程,当已完成队列为空时进程将睡眠,直到有条目在已完成连接队列中才唤醒。
backlog被规定为两个队列总和的最大值,大多数实现默认值为5,但在高并发web服务器中此值显然不够,lighttpd中此值达到128*8.需要设置此值更大一些的原因是未完成连接队列的长度可能因为客户端SYN的到达及等待三路握手第三个分节的到达延时而增大。
当客户端发起connect而导致发送syn分节给服务器端握手,如果这时两个队列都是满的,tcp就忽略此分节,并且不发RST,这将导致客户端TCP重发SYN(超时),服务器端忽略syn而不发RST响应的原因是如果发RST ,客户端connect将立即返回错误,强制客户端进程处理这种情况,而不是让tcp的正常重传机制来处理。实际上所有源自Berkeley的实现都是忽略新的SYN分节。
还有,backlog为0 时在linux上表明润许不受限制的连接数,这是一个缺陷,因为它可能会导致SYN Flooding(拒绝服务型攻击), 下一篇文章会简单解释。


cnwolfs 2012-04-21
  • 打赏
  • 举报
回复
我现在怀疑是连接池中存在有尚未完成连接的请求,因此导致了新连接被拒绝,请问如何解决这个问题。

怀疑的原因是这样的,我的客户端有心跳处理,现在配成每5秒一个心跳包,如果检测到心跳包没有正常返回,就会断开与服务端的连接创建新连接。另外,据之前一个拒绝连接的测试现象,拒绝服务之前我的电脑有过一小段时间的繁忙期,那时候我在工具栏点右键都不响应,然后就发生了拒绝的现象。另外,客户端程序是WiFi,有可能信号较差,据以前看到过的网文,也提到这种情况下有可能TCP握手协议没有完全完成。也会导致连接池中存在尚未完成连接的请求。

当前测试服务器是我的笔记本,配置对目前来说已经较低了,T7300双核+4G内存,跑WinXP,32位,也就内存就3G使用,查看状态,已用内存2G上下,已经设置成无虚拟内存的模式。跑了一个VS2010,进入Debug模式调试着,一个VS2008,做WinCE的开发测试,一个WinCE虚拟机。还有其它若干应用程序。
计划从他们公司搬台服务器来测试。当前服务器正跑着一个中间件,业务正在运行,因此无法用这台服务器测试,要建立另外的端口来测试有点小麻烦。


110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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