gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:30:58 24 4
gpt4 key购买 nike

我有一个客户端服务器情况,其中客户端打开到服务器的 TCP 套接字,有时会经过很长一段时间,但它们之间没有数据发送。我遇到了一个问题,服务器尝试向客户端发送数据,似乎成功了,但客户端从未收到,几分钟后,客户端似乎断开连接。

我是否需要每隔一段时间发送某种保活数据包?

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

最佳答案

在 Windows 上,没有发送数据的套接字是许多应用程序中的一个重要问题来源,必须正确处理。

问题是,SO_KEEPALIVE 的周期可以在系统范围内设置(否则,默认的两个小时是无用的)或使用后来的 winsock API。

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

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

但是,您必须小心上述问题。更复杂的是测试这种行为非常困难。例如,如果您设置正确并且希望正确检测断开连接,则无法通过断开物理层来测试它。这是因为 NIC 会感知到载波丢失,并且套接字层会发出信号以关闭所有依赖它的应用程序套接字。测试它的一个好方法是用 3 个分支连接两台计算机,中间有两个开关,断开中间分支,从而防止载波丢失,但仍然物理断开机器。

关于c# - 如果没有发送数据,TCP 套接字会在一段时间后自动关闭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11712425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com