当前位置: 首页 > 编程语言 > C#

如果没有数据发送,TCPsocket会在一段时间后自动关闭吗?分享

时间:2023-04-10 21:06:52 C#

TCPsockets是不是过段时间没有数据发送就自动关闭了?我有一个客户端服务器情况,客户端打开一个到服务器的TCP套接字,有时很长一段时间它们之间不会发送数据。我遇到了服务器尝试向客户端发送数据的问题,它似乎成功了,但客户端从未收到它,几分钟后,客户端似乎断开连接。我是否需要每隔一段时间发送一些保活数据包?编辑:请注意,这是同一台计算机上的对等体。一台计算机位于NAT后面,并且可以转发用于该计算机的一系列端口。连接到服务器的客户端通过DNS打开连接。即它使用mydomain.net和端口进行连接。在Windows上,没有发送数据的套接字是许多应用程序中的重要问题来源,必须妥善处理。问题是,SO_KEEPALIVE的周期可以在系统范围内设置(否则,默认值是无用的两个小时)或在winsockAPI后面。因此,许多应用程序确实偶尔会发送一些偶然的数据字节(被对等方忽略)只是为了使网络层在没有收到ACK后声明断开连接(在该层完成所有重复重传并且ack超时之后)。回答你的问题:不,套接字不会自动断开连接。但是,您必须注意上述问题。更复杂的是,测试这种行为非常困难。例如,如果一切设置正确,你想正确检测断开连接,你不能通过断开物理层来测试它。这是因为NIC将检测到载波丢失,并且套接字层将发出信号以关闭依赖于它的所有应用程序套接字。测试这一点的一个好方法是用三个分支和中间的两个开关连接两台计算机,断开中间分支,从而防止载波丢失,但仍然物理断开机器。TCP有一个内置超时,但您可以调整它,请参阅Socket类的SendTimeout和ReceiveTimeout,但我怀疑这不是您的问题。NAT路由器在从其端口转发表中删除之前也可能有TCP连接的过期时间。如果路由器在超时时间内没有流量通过,它会阻止所有传入的流量(因为它清除了内存中的转发信息,所以它不知道将流量发送到哪台计算机),并且可能还有传出连接源端口,因此服务器可能无法将其识别为同一连接。使用Keep-alive选项(linux下的SO_KEEPALIVE)来防止因不活动而断开连接更安全,但这可能会产生一些额外的数据包。本示例代码在linux下执行:intval=1;....//创建套接字之后问候。TCP套接字根本不会自动关闭。但是TCP连接可以。但是,如果这种情况发生在同一台计算机上的对等点之间,只要两个对等点都存在并且它们的套接字是打开的,就不应断开连接。以上就是C#学习教程:如果没有数据发送,TCPsocket会在一段时间后自动关闭吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: