我有一个iOS应用程序远程连接到3个插槽(某些硬件)。每个Socket都有自己的优先级。一个频道仅用于在iPad App和iPad之间传输消息。硬件,一个用于Tx / Rx图像,另一个用于Tx / Rx视频。我使用GCDAsyncSocket API&已经实现了所有三个套接字。使用MSGSocket / ImageSocket(OR)MSGSocket / VideoSocket时工作正常,但是当我开始同时使用VideoSocket / ImageSocket / MSGSocket时,事情就变得有点乱了。 我丢失了数据包。{实际上丢失了一大块文件: - ()我查看了API并发现API中的一些错误:Unable to complete Read Stream我认为可能是因此,我使用NSThreads / CFSocket API切换到线程并实现了相同的功能。
我使用NSThreads / CFSocket API& amp;更改了ImageSocket / VideoSocket代码的实现。这是同一dropbox-ed的实现。无论是在iOS App端还是在服务器端,我都无法理解出现问题的地方。根据我的理解,TCP通信中不会丢失数据包。
有没有办法调试此问题。我也要求通过代码&让我知道是否有任何问题(我知道这可能太多了,我要求但我需要一些保证,因为代码实现是正确的)。任何有助于解决此问题的帮助都将受到高度赞赏。
编辑1:在@JoeMcMahon评论之后,我提到了这个Technical Q&A&得到TCP Dump - trace.pcap file。我用Wireshark& amp;打开了这个tcp转储。它确实显示了硬件和端口之间传输的字节数。 iPad兼容。
同样在终端当我停止tcp转储捕获时,我看到了这些消息:
捕获的12463个数据包
过滤器收到的36469个数据包
内核丢弃的0个包
有人可以指出捕获的数据包之间的差异吗?过滤器收到的数据包?
注意 - 附加的TCP转储不适用于失败的情况
EDIT 1.1:找到了捕获数据包之间差异的答案。过滤器here
答案 0 :(得分:0)
无法保证TCP通信可靠。基本的ack-syn范例可能会破坏,这就是为什么你有重新传输机制等等.Wireshark在你的数据包捕获会话中报告了这样的问题。
对于使用wireshark / tcpdump,你通常想要提供一个过滤器,因为通过线路的流量是压倒性的(ping,ntp等),你想使用一些基本过滤器过滤捕获来查看数据包这与你有关。过滤掉的数据包未被捕获,因此存在数值差异。
如果它丢失了一大块文件,我怀疑问题是在TCP级别。最有可能的是更高级别的问题。我会通过频道重复运行一个固定大小的文件,直到我可以可靠地重现损失。