我正在运行这个简单的基于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]
最奇怪的是,在 main(成功)退出后,接收到的意外数据包。我已经在客户端(使用模拟器时)和服务器端检测到此数据包。
它们来自哪里?我该如何解决?
更新
与原始BSD-sockets和NSURLConnection的行为相同。如果我使用Safari或Chrome浏览器访问服务器,则没有此类数据包。
更新2
更新3
带有
getpid
的最佳答案
我不知道这是错误还是功能,但是发生的情况是,当您的应用程序退出且返回值为0时,它会通过启动重新启动。因此,您的应用程序运行了两次,因此尝试了两次TCP连接。
您可以通过在从主函数返回之前添加sleep(10)
来验证这一点;如果您观看过程监视器,则会看到它启动,运行10秒钟,然后退出,重新启动,再运行10秒钟。
如果您返回非零退出代码或只是不退出(因为iOS应用程序通常不退出),则不会发生这种情况。
关于ios - iPhone在不同端口上意外复制TCP数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21605916/