sockets - LTE 上的 UDP 流量
问题描述
我开发了一个 C++ 应用程序,通过 UDP 从 Odroid 设备上的网络摄像头流式传输视频。客户端是一个使用简单 UDP 套接字的 iPhone 应用程序,它可以通过 Wi-fi 完美运行,但不能通过 LTE。sendto() 调用工作正常,但 recvfrom() 永远阻塞。首先,我认为这与 iPhone 阻止 UDP 流量有关,但我还在笔记本电脑上尝试了一个客户端,该客户端连接到 iPhone 的热点并因此通过 LTE。您是否认为电话提供商会阻止 UDP 流量?我更喜欢 UDP 而不是 TCP,以实现更快的流式传输。任何建议将不胜感激!谢谢!
更新:经过进一步检查,我找到了问题的原因。事实证明,UDP over LTE 设置了 IP_MTU_DISCOVER 标志,如果用户的数据包大于设备的 MTU,它不会执行 IP 分段,而只是丢弃数据包。我的应用程序正在发送大于 MTU 的数据包,但在 Wi-fi 的情况下,它们在 IP 层被分段。如果禁用 IP_MTU_DISCOVER 标志,大数据包将被分段并成功到达目的地。另一种选择是从应用程序发送小于 MTU 的数据包。这两种方法都没有表现得那么好,但至少这个谜团已经解决了。
解决方案
推荐阅读
- c++ - 在 C/C++ 中使用 OpenGL 在 OpenCV 中显示图像
- c++ - 如何在 c++17 中生成内联 constexpr 普通数组数组
- hibernate - 在哪里可以找到 `hibernate.cfg.xml` 的官方示例?
- javascript - 制作一个没有 async/await 但只有 Promise 的异步生成器 *[Symbol.asyncIterator]
- python - 如何在 pypy3 windows 上安装 opencv-python?
- android - Firebase RealtimeDatabase 检索快照对象异常
- reactjs - 删除 Apollo 3 上的缓存
- android - AppWidgetHost.deleteAllHosts() 产生 NullPointer
- elasticsearch - 具有唯一值的 Elasticsearch 嵌套聚合(具有不同的嵌套文档)
- python - 枕头属性错误:“PhotoImage”对象没有属性“_PhotoImage__photo”