gpt4 book ai didi

objective-c - iOS 数据包长度

转载 作者:行者123 更新时间:2023-11-28 20:38:11 25 4
gpt4 key购买 nike

我正在编写一个小型应用程序,它基本上像 SOAP 一样来回交换 XML。我有一个基于 OS X 的服务器和一个 iPad 客户端。我在客户端使用 KissXML,在服务器端使用内置的 XML 解析器。我在两者上都使用 GCDAsyncSocket 进行通信。

当我在 iPad 模拟器上测试我的应用程序时,完整的 XML 通过了。一切正常。

但是,当我使用我的开发设备(实际的物理 iPad)时,其他一切正常,但 XML 在第 1426 个字符后终止。我已确认此错误发生在多台 iPad 上。

当我订阅 GCDAsyncSocket 上的传入数据包时,我使用[sock readDataWithTimeout:-1
缓冲区:[NSMutableData 新]
缓冲区偏移量:0
最大长度:0
tag:0];
和以前只是一个简单的 [sock readDataWithTimeout:-1 tag:0]; 但两者的结果相同。看来 GCDAsyncSocket 无论如何都不是罪魁祸首,因为在模拟器上执行得很好。请注意,maxLength 处的 0 表示“无限”缓冲区。

有人知道是什么原因造成的吗?

最佳答案

1426听起来很像MTU(Maximum Transmit Unit),就是你可以发送的最大TCP数据的大小。它在不同的网络媒体和不同的配置上大小不同,但 1426 很常见。

这表明您混淆了 TCP 数据包的接收和 XML 消息的完成。不能保证 TCP 数据包将在 XML 消息边界结束。 GCDAsyncSocket 是一个使用 TCP 而不是 XML 的低级库。

当您获得每个数据包时,您有责任将其连接到 NSMutableData 上,然后决定何时有足够的数据来处理它。如果您的协议(protocol)在每条消息后关闭连接,那么您可以阅读直到连接关闭。如果不是,那么您将不得不处理一个给定数据包甚至可能包含下一条消息的事实。您必须充分解析数据以确定边界在哪里。

顺便说一句,您的 Mac 与 iPad 的 MTU 很可能不同,这就是为什么您可能会在不同的平台上看到不同的行为。

关于objective-c - iOS 数据包长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9671423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com