我正在运行这个简单的基于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-sockets和NSURLConnection相同的行为。如果我使用Safari或Chrome访问服务器,则没有此类数据包。
getpid
:http://pastebin.com/w1niwMMU 答案 0 :(得分:3)
我不知道这是一个错误还是一个功能,但是当你的应用程序退出时返回值为0时,它会被launchd重新启动。因此,您的应用程序运行两次,因此尝试两次TCP连接。
您可以通过在从主要功能返回之前添加sleep(10)
来验证这一点;如果您观看过程监视器,您将看到它启动,运行10秒然后退出,重新启动并再运行10秒。
如果您返回非零退出代码或只是不退出(因为iOS应用程序通常不会退出),则不会发生这种情况。