TcpListener停止接受或接受断开的连接

时间:2011-05-12 12:57:05

标签: tcp serversocket

我们目前遇到在Windows上运行的自编服务器应用程序的问题(在不同版本上发生)。服务器侦听TCP端口,接受连接,交换一些数据,然后再次关闭连接。大约有100个客户端不时连接。

有时服务器停止工作:日志文件显示仍然接受连接,但在第一次读取尝试时发生套接字错误(10054 - 由对等方重置连接)。我不认为这是一个客户问题,因为它突然停止为所有客户工作。

现在我们发现,我们的旧服务器软件也出现了同样的问题,甚至是用另一种编程语言编写的。所以它在我们的程序中似乎不是一个错误 - 我认为它必须是某种操作系统/防火墙问题?当然,防火墙已被停用,但尚未解决问题。

有什么想法可以研究吗? Wireshark日志即将推出......

摘录日志(时间戳,线程ID,消息)

11:37:56.137 T#3960 Connection from 10.21.13.3
11:37:56.138 T#3960 Client Exception: Socket Error # 10054
Connection reset by peer.
11:37:56.138 T#3960 ClientDisconnected
11:38:00.294 T#4144 Connection from 10.21.13.3

您可以看到异常几乎在接受连接的同时发生,在这种情况下,客户端会在几秒钟后重新连接。

6 个答案:

答案 0 :(得分:5)

“有状态”防火墙或NAT会跟踪连接,并且应该为它不知道的连接发送RST。如果防火墙由于某种原因失去了连接跟踪,那么您可能会看到随机连接被重置。

我们的路由器在工作时会这样做 - 它会在PPP连接中断时忘记连接,这在下雨和DSL重启需要的时间太长时非常无益。但是,它不是重置连接,而是丢弃数据包(甚至更无用!)。

答案 1 :(得分:1)

听起来像是防火墙或路由问题 - 在超时期限之后,过时的连接可能会断开连接。你在协议中使用ping / keepalive吗? 否则你可能会要求Wireshark看看发生了什么。

答案 2 :(得分:1)

首先,感谢许多提示 - 我担心问题是一个完全不同的问题,你无法通过阅读我的问题来解决。

服务器应用程序使用log4net,配置日志文件为ImmediateFlush = true。如果每个日志语句都直接写入文件并且发生多个套接字连接,则会降低整个应用程序的速度。 服务器需要大约一分钟真正接受连接。这远远超过客户端的超时。因此,在日志中只显示“已接受”,然后显示“已断开连接” - 即使日志已延迟!

很抱歉给您带来不便......

答案 3 :(得分:0)

您是否尝试更改待办事项,然后查看在出现此问题之前服务的客户有多少时间或多少客户

答案 4 :(得分:0)

您没有说明您为服务器使用的Windows版本,但您应该知道Windows TCP / IP堆栈在服务器和客户端操作系统中的行为有所不同。客户端操作系统允许的并发传入连接数有限制,并且它们明显低于您的预期。

答案 5 :(得分:0)

客户端的日志是什么样的?

由于错误表明客户端正在断开连接;如果你在客户端看到相同的错误,那么它是一个防火墙或代理正在丢弃连接(双方看到相反的一方丢弃连接指示代理/防火墙)。

如果客户端没有错误;然后我会说你的客户端是你会看到实际错误的地方。