c++ - 套接字 UDP 处理不同大小的传入有效负载
问题描述
我正在努力在我的 udp 套接字中处理不同大小的paylod。我目前的想法是,找到可以产生的最大有效载荷,并为套接字创建一个该大小的缓冲区。这不会是未来的证明,如果我增加我的有效负载,每次更改都会失败或烦人。其次,这会增加我服务器中所有类型的计算时间,例如基本的心跳数据包,它不是那么大,但使用 100 字节,因为它对内存不太友好。
感谢您提供有关如何处理此问题的任何建议。
解决方案
只需使用 65535 字节的最大缓冲区,UDP 数据包不能大于此。使用动态大小的缓冲区不需要很棘手。 recvfrom()
将告诉您它在缓冲区中放置了多少字节。老实说,64K 足够小,不用担心它会浪费内存,除非您正在为嵌入式设备编写代码。
话虽如此,如果您绝对想使用动态缓冲区,那么在某些平台上,您可以使用recvfrom()
andMSG_PEEK
标志MSG_TRUNC
(Windows 不支持MSG_TRUNC
on recvfrom()
or WSARecvFrom()
,仅 on WSARecvMsg()
)来确定下一个数据包的大小,然后调整缓冲区大小因此,然后在没有标志的情况下再次调用recvfrom()
以将数据包读入缓冲区。
推荐阅读
- python - 如何在 Django Views,Python 中的函数之外放置 if 语句
- python - pybind11 不兼容的函数参数。支持以下参数类型: 1. (arg0: _GstPadProbeInfo) -> capsule
- sqlalchemy - SQLAlchemy:如何在连接查询中的过滤器之前应用 distinct
- java - 无法引用 Listview id(帮助!)
- scala - Scala 在 setter 中自动创建函数
- python - 如何在 PyCharm 中调试外部 python 包
- ios - Flutter:Podfile 和 Apple Watch
- android - 带有 clicable 链接的 EditText,但在用户自己更改之前不可编辑/Kotlin,Android
- javascript - ReactJS:更新对象状态内的数组不会触发重新渲染
- php - Codeigniter 在辅助函数中的函数中使用函数