iPhone在不同端口上意外复制TCP数据包

时间:2014-02-06 14:41:04

标签: ios iphone sockets nsurlconnection boost-asio

我正在运行这个简单的基于asio的program

Address address = Address::from_string(host);
Tcp::endpoint ep(address, port);
Tcp::resolver::iterator endpoint_iterator = resolver.resolve(ep);
Tcp::socket socket(io_service);
asio::connect(socket, endpoint_iterator);

我的主机上一切正常,但是当这个程序在iOS(iphone和iphonesimulator)下运行时,我的嗅探器检测到一些意外的数据包:

# client: 192.168.1.10, server: 192.168.1.100
# everything fine...
5.359761000 192.168.1.10  192.168.1.100  52712 [SYN]
5.359989000 192.168.1.100 192.168.1.10   52712 [SYN, ACK]
5.364103000 192.168.1.10  192.168.1.100  52712 [ACK]
5.364103000 192.168.1.10  192.168.1.100  52712 [FIN, ACK]
5.364386000 192.168.1.100 192.168.1.10   52712 [FIN, ACK]
5.366095000 192.168.1.10  192.168.1.100  52712 [ACK]
# Here comes unexpected part...
5.632569000 192.168.1.10  192.168.1.100  52716 [SYN]
5.632891000 192.168.1.100 192.168.1.10   52716 [SYN, ACK]
5.638314000 192.168.1.10  192.168.1.100  52716 [ACK]
5.638633000 192.168.1.10  192.168.1.100  52716 [FIN, ACK]
5.639017000 192.168.1.100 192.168.1.10   52716 [FIN, ACK]
5.644743000 192.168.1.10  192.168.1.100  52716 [ACK]

最奇怪的部分是在主(成功)退出后收到的意外数据包。我在客户端(当使用模拟器时)和服务器端都检测到这些数据包。

他们来自哪里?我该如何解决?

更新

与原始BSD-socketsNSURLConnection相同的行为。如果我使用Safari或Chrome访问服务器,则没有此类数据包。

更新2

更新3

1 个答案:

答案 0 :(得分:3)

我不知道这是一个错误还是一个功能,但是当你的应用程序退出时返回值为0时,它会被launchd重新启动。因此,您的应用程序运行两次,因此尝试两次TCP连接。

您可以通过在从主要功能返回之前添加sleep(10)来验证这一点;如果您观看过程监视器,您将看到它启动,运行10秒然后退出,重新启动并再运行10秒。

如果您返回非零退出代码或只是不退出(因为iOS应用程序通常不会退出),则不会发生这种情况。