如果没有数据发送,TCP套接字会在一段时间后自动关闭吗?

Nic*_*nks 8 c# sockets timeout tcp disconnect

我有一个客户端服务器的情况,客户端打开到服务器的TCP套接字,有时很长一段时间将通过它们之间没有数据发送.我遇到了一个问题,服务器试图将数据发送到客户端,它似乎成功,但客户端从未收到它,几分钟后,它看起来像客户端断开连接.

我是否需要每隔一段时间发送一些保持活动包?

编辑:要注意,这是在同一台计算机上的同行.计算机位于NAT后面,可以转发用于此计算机的一系列端口.与服务器连接的客户端通过DNS打开连接.即它使用mydomain.net和端口进行连接.

Pav*_*sky 8

在Windows上,没有数据发送的套接字是许多应用程序中出现问题的重要原因,必须正确处理.

问题是,SO_KEEPALIVE的句点可以在系统范围内设置(否则,默认值是无用的两小时)或后来的winsock API.

因此,许多应用程序确实偶尔发送一些偶然的数据字节(被对等方忽略),只是为了在没有收到ACK之后使网络层声明断开连接(在由层和ack超时完成所有重复的重传之后).

回答你的问题:不,套接字不会自动断开连接.

但是,你必须小心上述问题.进一步复杂化的是,测试这种行为非常困难.例如,如果正确设置所有内容并且您希望正确检测断开连接,则无法通过断开物理层来测试它.这是因为NIC将检测到载波丢失,并且套接字层将发出信号以关闭所有依赖它的应用程序套接字.测试它的一个好方法是连接两台计算机,其中三条腿和两个开关介于两者之间,断开中间支路,从而防止载波丢失但仍然在物理上断开机器.