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

TcpListener停止接受或接受断开的连接,tcp,serversocket,Tcp,Serversocket,我们目前遇到一个在Windows上运行的自编服务器应用程序的问题(发生在不同版本上)。服务器侦听TCP端口,接受连接,交换一些数据,然后再次关闭连接。大约有100个客户端可以随时连接 有时服务器会停止工作:日志文件显示连接仍然被接受,但在第一次尝试读取时会发生套接字错误(10054-对等方重置连接)。我不认为这是一个客户问题,因为它突然停止为所有客户工作 现在我们发现,我们的旧服务器软件也出现了同样的问题,甚至是用另一种编程语言编写的。所以这似乎不是我们程序中的错误——我认为这一定是某种操作系统

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

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

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

有什么好主意去调查吗?Wireshark日志将很快发布

日志摘录(时间戳、线程Id、消息)


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

听起来像是防火墙或路由问题-可能是过时的连接在超时后被断开。您是否在协议中使用ping/keepalive。

否则,您可能会要求Wireshark查看发生了什么。

听起来像是防火墙或路由问题-可能是过时的连接在超时后被断开。您是否在协议中使用ping/keepalive。

否则,您可能会要求Wireshark查看发生了什么。

您是否尝试过更改待办事项,然后查看在该问题发生之前有多少时间或多少客户端被服务

您是否尝试过更改待办事项,然后查看在该问题发生之前有多少时间或多少客户端被服务

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

我们的路由器在工作中做到了这一点——当PPP连接断开时,它会忘记连接,这在下雨和DSL重启时间过长时是非常没有帮助的。然而,它不是重置连接,而是丢弃数据包(甚至更没有帮助!)。

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


我们的路由器在工作中做到了这一点——当PPP连接断开时,它会忘记连接,这在下雨和DSL重启时间过长时是非常没有帮助的。但是,它不是重置连接,而是丢弃数据包(更没有帮助!)。

您没有说明服务器使用的是什么Windows版本,但您应该知道Windows TCP/IP堆栈在服务器和客户端操作系统中的行为不同。客户端操作系统允许同时传入连接的数量是有限制的,并且比您预期的要低得多。

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

从客户端看,日志是什么样子的

因为错误表明客户端正在断开连接;如果您在客户端看到相同的错误,则是防火墙或代理正在断开连接(看到对方断开连接的双方都表示存在代理/防火墙)


如果客户端不存在错误;那么我想说,您的客户端就是您将看到实际错误的地方。

从客户端看,日志是什么样子的

因为错误表明客户端正在断开连接;如果您在客户端看到相同的错误,则是防火墙或代理正在断开连接(看到对方断开连接的双方都表示存在代理/防火墙)


如果客户端不存在错误;然后我会说,您的客户端就是您将看到实际错误的地方。

首先,感谢您的提示-恐怕问题完全不同,您不可能通过阅读我的问题来解决

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


很抱歉给您带来不便…

首先,感谢您的提示-恐怕问题完全不同,您不可能通过阅读我的问题来解决

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


很抱歉给您带来不便…

嘿,连接在接受后会立即被访问(读取),因此可能与超时无关。我们问过Wireshark,但我们可能得试一下
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