首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果没有发送数据,TCP套接字会在一段时间后自动关闭吗?

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

Stack Overflow用户
提问于 2012-07-29 19:50:47
回答 4查看 32.5K关注 0票数 12

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

我需要每隔一段时间发送一些保持生命的包裹吗?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-30 00:42:50

在Windows上,没有发送数据的套接字在许多应用程序中是一个很大的麻烦源,必须正确处理。

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

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

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

然而,你必须小心处理上面的问题。更复杂的是,测试这种行为是非常困难的。例如,如果您正确设置了所有内容,并且希望正确检测断开连接,则无法通过断开物理层来测试它。这是因为NIC将感知载波丢失,套接字层将发出信号关闭所有依赖它的应用程序套接字。一种很好的测试方法是将两台三条腿的计算机连接起来,中间有两个开关,这样就可以防止载波丢失,但仍能在物理上断开机器。

票数 9
EN

Stack Overflow用户

发布于 2012-07-29 19:54:52

有一个内置到TCP的超时,但您可以调整它,请参阅SendTimeout和ReciveTimeout of 套接字类,但我怀疑这不是您的问题。NAT路由器在从其端口转发表中删除TCP连接之前,也可能有TCP连接的过期时间。如果路由器上的超时时间内没有通信量通过,它将阻塞所有传入的通信量(因为它从其内存中清除了转发信息,因此它不知道要将流量发送到哪台计算机),并且传出的连接可能有不同的源端口,因此服务器可能无法识别它是相同的连接。

票数 0
EN

Stack Overflow用户

发布于 2012-07-30 00:33:14

TCP套接字根本不会自动关闭。然而,TCP连接是这样的。但是,如果在同一台计算机中的对等点之间发生这种情况,则只要两个对等点都存在并打开它们的套接字,就不应该删除连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11712425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档