我有一个客户端服务器的情况,客户端打开TCP套接字到服务器,有时很长的时间会过去,没有数据之间发送。我遇到了一个问题,服务器试图向客户端发送数据,这似乎是成功的,但客户端从未接收到数据,几分钟后,客户端似乎就断开了连接。
我需要每隔一段时间发送一些保持生命的包裹吗?
编辑:要注意的是,这是在同一台计算机上的同行。该计算机位于NAT之后,该NAT转发用于此计算机的一系列端口。与服务器连接的客户端通过DNS打开连接。也就是说,它使用mydomain.net &端口进行连接。
发布于 2012-07-30 00:42:50
在Windows上,没有发送数据的套接字在许多应用程序中是一个很大的麻烦源,必须正确处理。
问题是,SO_KEEPALIVE的周期可以在系统范围内设置(否则,默认设置的时间为两个小时),或者使用后面的winsock API。
因此,许多应用程序确实不时地发送一些偶尔的数据字节(被对等方忽略),只是为了使网络层在未接收到ACK之后声明断开连接(在该层完成所有到期的重传和ack timeout之后)。
回答您的问题:不,套接字不会自动断开。
然而,你必须小心处理上面的问题。更复杂的是,测试这种行为是非常困难的。例如,如果您正确设置了所有内容,并且希望正确检测断开连接,则无法通过断开物理层来测试它。这是因为NIC将感知载波丢失,套接字层将发出信号关闭所有依赖它的应用程序套接字。一种很好的测试方法是将两台三条腿的计算机连接起来,中间有两个开关,这样就可以防止载波丢失,但仍能在物理上断开机器。
发布于 2012-07-29 19:54:52
有一个内置到TCP的超时,但您可以调整它,请参阅SendTimeout和ReciveTimeout of 套接字类,但我怀疑这不是您的问题。NAT路由器在从其端口转发表中删除TCP连接之前,也可能有TCP连接的过期时间。如果路由器上的超时时间内没有通信量通过,它将阻塞所有传入的通信量(因为它从其内存中清除了转发信息,因此它不知道要将流量发送到哪台计算机),并且传出的连接可能有不同的源端口,因此服务器可能无法识别它是相同的连接。
发布于 2012-07-30 00:33:14
TCP套接字根本不会自动关闭。然而,TCP连接是这样的。但是,如果在同一台计算机中的对等点之间发生这种情况,则只要两个对等点都存在并打开它们的套接字,就不应该删除连接。
https://stackoverflow.com/questions/11712425
复制相似问题