-
Notifications
You must be signed in to change notification settings - Fork 3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GCDAsyncUDPSocket can not send data when data is greater than 9K? #535
Comments
你可以查看一下MTU的大小。9k肯定超过了,数据在IP层会被分片。UDP本身就是不可靠的,其中任意一部分出现了问题整个数据包都会被丢弃。你可以尝试抓包分析一下。 |
谢谢 Noskthing 的回答 这个问题我也查了些资料,其中在模拟器上调试时,如果在终端调整下udp限制 |
我在GCDAsyncUdpSocket.m中看到max4ReceiveSize = 9216; max6ReceiveSize = [9216;详细原因你看这里#222 我做了一个简单的测试,使用两台手机在同一个局域网内UDP通讯,传输的数据我选择了两张图片,一张1kb左右的图片传输成功,一个16k的图片在执行发送命令的时候虽然没有你说的错误出现,但是wireshark里看不到相关的广播包发出。我截取了NSData,测试以后发现最大能够发生的包的大小就是9216。 所以我的推断就是iPhone对于UDP的收发包大小限制在了9216。暂时我也确实没有找到能够修改这个参数的方法。关于你的情况我的建议是:超过9216的包你能否分次传输,自己定一个协议,每次截取9kb大小的数据,在前面拼接两个字节,第一个字节做index使用,第二个字节高四位标识这个数据包分片成了几个,低四位注明这是这个总数据包的第几个。如果高低四位都是1那这个数据包就是一张完整的图片,否则等待其他UDP数据包来截取真正的数据部分做拼接处理。 |
非常感谢 Noskthing GCDAsyncUdpSocket.m中的max4ReceiveSize和max6ReceiveSize参数,我之前试过,不过没起作用,所以我觉得可能真的是系统上的限制行为。 实在不行,我准备试试分包发送,再次感谢🙏 |
… size of UDP packet.
我找到了解决的办法。已经pr上去了。原因就是UDP缓冲区只有9216,在代码里修改接收区的大小为65535,我测试可以传输较大数据量的图片了。 |
你是直接在GCDAsyncUdpSocket.m文件内修改(line:378): 我这样试过了,还是不行,会直接在udpSocketDidClose 里提示"Message too long",不知道你是如何实现的? |
函数setsockopt设置接收区大小。 max4ReceiveSize/max6ReceiveSize不改你也只能接收9216的 |
能具体点吗?我找了setsockopt几个地方,没找到设置的。。。。囧 |
非常感谢🎁 我测试了下,成功了! |
我用UDP 发送信息 显示 "No route to host",这种情况应该怎么处理? |
#536 这个链接打不开,404 |
This issue has been marked as stale, it will be closed automatically if there is no further activity. |
我使用UDP,准备发送一张图片,当大小大于9k,就不能发送,反之就可以
I use UDP, ready to send a picture, when the size is greater than 9K, it can not be sent, otherwise you can
this is why?
The text was updated successfully, but these errors were encountered: