我有一个iOS应用程序,它远程连接到(某些硬件的)3个套接字。每个套接字都有自己的优先级。一个通道仅用于在iPadApp&硬件,一个用于Tx/Rx图像,另一个用于Tx/Rx视频。我已经使用GCDAsyncSocket API&使用MSGSocket/ImageSocket(OR)MSGSocket-VideoSocket时一切都很好,但当我开始同时使用VideoSocket/ImageSocket/MSGSocket时,情况就有点混乱了我丢失数据包。{实际上有一大块文件丢失了:-(}我检查了API并在API中发现了一些错误:无法完成读流,我认为这可能是问题的原因。因此,我切换到线程并使用NSThreads/CFSocket API实现了相同的功能。
我使用NSThreads/CFSocket API&以下是相同dropbox-ed的实现。我只是不明白哪里出了问题,无论是在iOS应用程序端还是在服务器端。据我所知,TCP通信中不会丢失数据包。
是否有方法调试此问题。此外,我要求通过代码&如果有什么地方出了问题,请告诉我(我知道这可能是我要求的太多了,但我需要确保代码实现是正确的)。如能为解决此问题提供任何帮助,我们将不胜感激。
第1版:在@JoeMcMahon发表评论后,我提到了这个技术问答;A&得到一个TCP Dump-trace.pcap文件。我用Wireshark&它确实向我展示了在硬件端口之间传输的字节&iPad。同样在终端中,当我停止tcp转储捕获时,我看到了以下消息:
捕获12463个数据包
筛选器接收到36469个数据包
内核丢弃了0个数据包
有人能指出捕获的数据包与;过滤器收到的数据包
注意-附加的TCP转储不适用于失败的情况
编辑1.1:找到了捕获的数据包之间差异的答案&这里的过滤器接收到的数据包
TCP通信不能保证可靠。基本的ack-syn范式可能会被打破,这就是为什么你有重新传输机制等。Wireshark在你的数据包捕获会话中报告了这样的问题。
对于使用wireshark/tcpdump,您通常希望提供一个过滤器,因为通过有线传输的流量是巨大的(ping、ntp等),所以您希望使用一些基本过滤器来过滤捕获,以查看与您相关的数据包。过滤掉的数据包没有被捕获,因此存在数值差异。
若它是丢失了一大块文件,我怀疑这个问题是TCP级别的。很可能是更高层出了问题。我会在通道中重复运行一个固定大小的文件,直到我能够可靠地再现丢失。