我正在尝试使用c ++中的套接字接收UDP消息
我正在标题中发送消息的大小,所以我可以知道应该分配多少内存,所以我试着看一下这样的消息的开头:
int bytesRead = recvfrom(m_socketId, (char*)&header, Message::HeaderSize, MSG_PEEK, (struct sockaddr *)&fromAddr, &addrSize);
但我一直收到系统错误10040:
“在数据报套接字上发送的消息 比内部消息大 缓冲区或其他一些网络限制,或 用于接收数据报的缓冲区 into小于数据报 本身。“
有没有办法偷看信息的乞讨? 谢谢:)
答案 0 :(得分:6)
鉴于maximum size of a UDP packet为65507
,您只需为所有recvfrom()
次呼叫分配一个64k'弹跳缓冲区' - 一旦您将其复制,请阅读大小,分配一个新的缓冲区,并以恰当的大小制作一个数据包副本。
对于将数据包数据复制太多而言有点浪费,但它可以让你以正确的大小分配缓冲区。
或者,如果您知道由于应用程序的体系结构,您的对等方将永远不会生成大于8k的数据包,您可能只需分配8k缓冲区并浪费空间。意识到内存使用很重要,但有时只是刻录一个额外的页面会导致更简单的代码。
答案 1 :(得分:3)
您可以尝试WSARecvMsg(..., MSG_PEEK)
。您将在结果中设置MSG_TRUNC
标志,但您还应该有要求的标头字节。
答案 2 :(得分:0)
您的代码实际上非常好。您应该已经在recvfrom的页面上阅读了错误代码WSAEMSGSIZE
(这是您的10040
)的说明。
消息太大而无法容纳buf参数指向的缓冲区并被截断。
在您的情况下,错误代码WSAEMSGSIZE
实际上并不是错误,因为您有意读取的内容少于完整数据包。只需解析标题,然后读取没有MSG_PEEK
的完整数据包,即可从输入队列中删除数据包。