首页 > 解决方案 > 套接字 UDP 处理不同大小的传入有效负载

问题描述

我正在努力在我的 udp 套接字中处理不同大小的paylod。我目前的想法是,找到可以产生的最大有效载荷,并为套接字创建一个该大小的缓冲区。这不会是未来的证明,如果我增加我的有效负载,每次更改都会失败或烦人。其次,这会增加我服务器中所有类型的计算时间,例如基本的心跳数据包,它不是那么大,但使用 100 字节,因为它对内存不太友好。

感谢您提供有关如何处理此问题的任何建议。

标签: c++sockets

解决方案


只需使用 65535 字节的最大缓冲区,UDP 数据包不能大于此。使用动态大小的缓冲区不需要很棘手。 recvfrom()将告诉您它在缓冲区中放置了多少字节。老实说,64K 足够小,不用担心它会浪费内存,除非您正在为嵌入式设备编写代码。

话虽如此,如果您绝对想使用动态缓冲区,那么在某些平台上,您可以使用recvfrom()andMSG_PEEK标志MSG_TRUNC(Windows 不支持MSG_TRUNCon recvfrom()or WSARecvFrom(),仅 on WSARecvMsg())来确定下一个数据包的大小,然后调整缓冲区大小因此,然后在没有标志的情况下再次调用recvfrom()以将数据包读入缓冲区。


推荐阅读