Tcp socket突然关闭连接

时间:2011-05-01 21:55:16

标签: c# networking

我有一个聊天网站(http://www.pitput.com),通过套接字连接来连接用户。 我在客户端有一个flash对象,它打开了与服务器端口的连接。 在服务器中,我有一个在异步事件中侦听该端口的服务。

一切正常,除非我在一段不知名的时间(大约几分钟)之后与某人交谈,服务器正在关闭我的连接并且我在服务器中收到错误: “连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应”。

我不知道tcp套接字是如何工作的。它是否每隔几秒检查一次“实时”连接?它是如何决定何时关闭连接的?我非常确定关闭操作不是来自客户端。

感谢。

3 个答案:

答案 0 :(得分:1)

听起来服务器正在处理连接但没有响应。我通常会提取WireShark来了解发生了什么。

答案 1 :(得分:1)

TCP / IP确实有一个检查实时连接的选项;它被称为“keepalive”。 Keepalive几乎从未使用过。它们默认不启用。可以通过调整注册表在系统范围内启用它们,但IIRC的最低超时为1小时。它们也可以在单个套接字上启用(以分钟为单位的超时),但是你知道你的应用程序是否会这样做。

如果您正在使用Web服务并且您的客户端正在连接到HTTP / HTTPS端口,那么它可能会被HTTP服务器关闭(通常在几分钟的空闲时间后关闭它们的连接)。在一段空闲时间之后,中间路由器可能会代表您关闭它(这不是默认行为,但公司路由器有时配置有这样的“有用”设置)。

如果您使用的是Win32服务,那么它实际上听起来像客户端正在丢弃连接或丢失其网络(例如,移出无线路由器的范围)。在后一种情况下,客户端可能仍然无视连接已关闭的事实(这种情况称为"half-open");服务器看到关闭但客户端认为连接仍在那里。

答案 2 :(得分:0)

这是一个由某个公司托管的ASP网络服务吗?如果是这样,服务器通常每10至20分钟回收一次应用程序。您无法无限期地运行Web服务,除非它是您自己的服务器(我相信)。