【发布时间】:2017-02-08 20:19:11
【问题描述】:
我们在设备上使用 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 端口建立新连接?
【问题讨论】:
-
它由完成挂起的发送或在未得到确认时中止它们所花费的时间来定义。我不明白有关“用户希望使用新 IP 地址重新连接到设备”的部分。为什么要新的 IP 地址?
-
因为用户命令更改了以太网 IP 地址。现在用户需要在更改 IP 后立即使用新的 IP 地址重新启动应用程序。
-
如何通过丢弃挂起的 Send-Q 数据包来找出关闭这个孤立套接字所需的时间?
-
没有“以太网 IP 地址”之类的东西。它是哪一个?以太网地址改变了? IP地址变了?两者都有?
标签: sockets tcp embedded-linux shutdown