为 GCDAsyncUdpSocket 设置最大数据包大小

Posted

技术标签:

【中文标题】为 GCDAsyncUdpSocket 设置最大数据包大小【英文标题】:set max packet size for GCDAsyncUdpSocket 【发布时间】:2012-02-03 02:57:16 【问题描述】:

我正在使用 GCDAsyncUdpSocket 向多播组发送/接收数据。例如,在 GCDAsyncUdpSocket.m 文件中,我找到了下面的设置并将值更改为 32768。但我仍然无法接收任何大于 9216 字节的数据包。

max4ReceiveSize = 9216;
max6ReceiveSize = 9216;

还有其他设置吗?

编辑: 我发现 GCDAsyncUdpSocket 类确实提供了一种方法来设置这个值,称为 setMaxReceiveIPv4BufferSize。试过了,但它仍然只收到大约 9216 字节。

【问题讨论】:

你好如何解决这个接收任何大于 9216 字节的数据包。请说 【参考方案1】:

随着设置的不同,准确了解您所使用的操作系统会有所帮助。在 OS X 10.6 上,查看:

# sysctl net.inet.udp.maxdgram
net.inet.udp.maxdgram: 9216

但是,您必须记住,任何数据路径的最大传输单元 (MTU) 将由路径中任何设备支持的最小值决定。换句话说,如果只有一个设备或软件规则拒绝处理大于特定大小的数据报,那么这将是该路径的限制。因此,许多设备上可能有许多设置会影响这一点。另请注意,IPv4 和 IPv6 的 MTU 规则完全不同,有些路由器对多播和单播有不同的规则。

一般来说,假设任何大于 576 字节(包括所有协议标头)的 IP 数据报都将被允许通过是不安全的,因为 576 是 IPv4 保证将支持的最大 IP 数据包大小。对于 IPv6,保证大小为 1280。大多数设备将支持更大的数据包,但不是必须的。

【讨论】:

GCDAsyncUdpSocket 是一个适用于 Mac 和 ios 的库,来自:github.com/robbiehanson/CocoaAsyncSocket 正确,但是我们谈论的是哪个版本的 OSX 或 iOS 很重要,因为各种系统设置的名称和默认值在不同的版本中会发生变化。如果您知道您将使用特定环境,则可以根据该环境定制代码或调整环境。但是如果你需要处理一般情况,你必须准备好应对小数据报。 根据上述库的作者,我遇到了 SO_RCVBUF 问题。你知道如何读取 iOS 和 Mac 允许的最大值吗?顺便说一句:我知道您上面的原始答案有一些技术含义。对于我正在做的事情只是一些实验。 在这种情况下,假设 10.5 或更高版本,您可能需要 i=1048576; socket(s,SOL_SOCKET,SO_RCVBUF,&i,sizeof(i)); 并对 SO_SNDBUF 执行相同操作。 iOS 3 或更高版本可能相同。 看起来 9k 也是 Windows 的设置。谢谢你的信息。

以上是关于为 GCDAsyncUdpSocket 设置最大数据包大小的主要内容,如果未能解决你的问题,请参考以下文章

GCDAsyncUdpSocket 在发送到 IPv6 地址时立即关闭

mysql数据库最大连接数可以设置为多少

mysql数据库最大连接数可以设置为多少

GCDAsyncUdpSocket,“不能多次绑定套接字”

GCDAsyncUdpSocket接收数据时抛出malloc错误

使用 GCDAsyncUdpSocket 的 iOS swift 应用程序