如何突然关闭TCP套接字并重新连接

时间:2016-09-30 09:39:19

标签: sockets tcp embedded-linux shutdown

我们在设备上使用Linux 2.6.33。将使用通过TCP套接字连接到设备的PC应用程序。根据申请要求,最多可传输1 MB数据。

考虑如果应用程序已连接且工作正常,并且设备的IP地址之间发生了变化(这可以通过命令实现)。现在连接在应用程序中突然中断,但在设备上却没有。但是用户希望使用新的IP地址重新连接到设备。在某些情况下,“send()”是中途,可能没有发送所有数据。然后这种关闭不会立即发生。因此,在设备关闭套接字之前,用户将无法重新连接。

我使用“shutdown(sock,RDWR),close(sock)”序列。 netstat输出显示:

$ netstat -nt
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0  29200 xx.xx.xx.xx:3000       xx.xx.xx.xx:50639       ESTABLISHED

因为它显示Send-Q仍然不为空,因此连接仍处于ESTABLISED状态。这个插座在一段时间后关闭,我不确定它是多少时间。可以通过套接字实现来定义。

如何立即关闭此套接字,以便可以通过PC应用程序在同一TCP端口上建立新连接?

2 个答案:

答案 0 :(得分:0)

关闭套接字总是需要时间。但是你可以使用setsockopt()重用同一个端口。查找更多   detail在此链接上。

答案 1 :(得分:0)

  

如何立即关闭此套接字以便建立新连接   PC应用程序可以使用相同的TCP端口吗?

你可以通过调用close()来关闭它,但你真正想知道的是如何检测这个条件,以便你知道何时调用close()。答案是:不容易 - 就您的Linux设备而言,(the_old_ip_address)的客户端只是停止响应。 Linux设备无法知道这种情况是由于客户端的IP地址发生了变化,而不是(比如说)临时网络中断,因此Linux设备会在超时之前继续尝试几分钟

就解决您遇到的问题而言,可能最好的方法是设计您的服务器,以便它可以同时接受和服务多个TCP连接。如果你这样做,那么如果旧的TCP连接会持续几分钟就会变得非常重要,因为用户仍然可以立即从他的新IP地址重新连接并继续工作而无需等待。

也就是说,另一种方法是向服务器添加超时,这样如果在TCP套接字上没有发送或接收数据N秒(对于您认为合适的N值),服务器会显式调用socket上的close()并侦听新的传入连接。然而,这不是一个非常好的解决方案,因为它假设TCP连接的性能(即,当它处于"工作"状态时,它将始终发送或接收数据至少一次每隔N秒),这个假设可能不正确 - 即如果您的客户端和服务器不想发送任何内容一段时间,或者网络连接是否足够严重以至于没有数据通过超过N秒。风险在于这将导致误报,导致服务器关闭仍然有效的TCP连接。因此,如果可能的话,我建议采用第一种方法,而不是这种方法。

相关问题