当客户端机器的IP发生变化时,TCP recv行为是什么?

时间:2011-11-30 09:15:09

标签: c sockets networking tcp recv

客户端计算机的IP地址或任何其他修改的更改是否会影响客户端计算机中的recv()调用?

在服务器端没有进行任何更改。

在客户端,TCP recv()将超时[120秒]。那是为什么?

如果客户端的IP在创建套接字后出现问题,recv()会超时吗?

操作系统:客户端和服务器都是solaris

请告诉我更多详情。

我认为客户端的recv超时是因为IP已更改但不确定。

我想知道是否有任何可用的日志消息或任何其他方法来查找为什么recv超时120秒?

5 个答案:

答案 0 :(得分:2)

连接由两个端点标识,TCP / IP中的端点是ip-address和端口号的组合。如果四个中的一个(两个IP地址和两个端口)发生更改,则连接将再次无效。换句话说,如果客户端计算机的IP地址已更改,程序中的旧套接字仍然认为它是旧的IP地址,服务器也将具有旧的IP地址。

在你的程序中,在出错时关闭旧连接(确实是任何错误)并重新连接到服务器。

答案 1 :(得分:1)

在TCP中,连接由元组标识(源地址,源端口,目标地址,目标端口)。如果其中一个设备的IP地址以旧旧设备的IP地址发生变化,则连接无法持续存在。

由于已建立连接的两侧通过这些方式彼此分开,因此它们不会从另一方接收任何东西。所以连接最终会超时。

(在IPv6中,有可能添加一个新地址而不删除另一个地址;也许在IPv4中,我不确定是否会这样做。)

在UDP中,如果地址发生变化且发件人不知道,则显然无法发送该消息。

答案 2 :(得分:1)

当您更改客户端的IP地址时,来自服务器的IP数据包不再传送到客户端:毕竟它们用于另一个地址。由于没有收到数据包,并且从新地址发送的所有数据包都不属于任何连接并被丢弃,因此TCP连接最终因RST数据包而超时或丢失。

您唯一的选择是重新建立连接,无法通知TCP对等方有关地址更改的信息。

答案 3 :(得分:1)

没有什么可以告诉你为什么发生超时,只是发生超时。您需要通过读取或写入来访问连接,以检测连接的状态。如果IP更改,则旧连接现在无效,recv()应报告错误,而不是超时。

答案 4 :(得分:0)

很难说。这取决于IP地址发生变化的机器会发生什么。如果它继续将连接上的传入数据识别为有效的传入连接,如5元组{tcp,本地IP,本地端口,远程IP,远程端口}所定义,那么你很幸运,否则不行。