在c ++中查看UDP消息

时间:2011-04-02 06:23:14

标签: c++ windows udp peek


我正在尝试使用c ++中的套接字接收UDP消息 我正在标题中发送消息的大小,所以我可以知道应该分配多少内存,所以我试着看一下这样的消息的开头:

int bytesRead = recvfrom(m_socketId, (char*)&header, Message::HeaderSize, MSG_PEEK, (struct sockaddr *)&fromAddr, &addrSize);  

但我一直收到系统错误10040:

  

“在数据报套接字上发送的消息   比内部消息大   缓冲区或其他一些网络限制,或   用于接收数据报的缓冲区   into小于数据报   本身。“

有没有办法偷看信息的乞讨? 谢谢:)

3 个答案:

答案 0 :(得分:6)

鉴于maximum size of a UDP packet65507,您只需为所有recvfrom()次呼叫分配一个64k'弹跳缓冲区' - 一旦您将其复制,请阅读大小,分配一个新的缓冲区,并以恰当的大小制作一个数据包副本。

对于将数据包数据复制太多而言有点浪费,但它可以让你以正确的大小分配缓冲区。

或者,如果您知道由于应用程序的体系结构,您的对等方将永远不会生成大于8k的数据包,您可能只需分配8k缓冲区并浪费空间。意识到内存使用很重要,但有时只是刻录一个额外的页面会导致更简单的代码。

答案 1 :(得分:3)

您可以尝试WSARecvMsg(..., MSG_PEEK)。您将在结果中设置MSG_TRUNC标志,但您还应该有要求的标头字节。

答案 2 :(得分:0)

您的代码实际上非常好。您应该已经在recvfrom的页面上阅读了错误代码WSAEMSGSIZE(这是您的10040)的说明。

  

消息太大而无法容纳buf参数指向的缓冲区并被截断。

在您的情况下,错误代码WSAEMSGSIZE实际上并不是错误,因为您有意读取的内容少于完整数据包。只需解析标题,然后读取没有MSG_PEEK的完整数据包,即可从输入队列中删除数据包。