C++ 在c++;

C++ 在c++;,c++,windows,udp,peek,C++,Windows,Udp,Peek,我尝试用C++中的套接字接收UDP消息。 我在邮件头中发送邮件的大小,这样我就可以知道应该分配多少内存,所以我试着像这样查看邮件的大小: int bytesRead = recvfrom(m_socketId, (char*)&header, Message::HeaderSize, MSG_PEEK, (struct sockaddr *)&fromAddr, &addrSize); 但我一直收到系统错误10040: “通过数据报套接字发送的消息 大于内部消息 缓


我尝试用C++中的套接字接收UDP消息。 我在邮件头中发送邮件的大小,这样我就可以知道应该分配多少内存,所以我试着像这样查看邮件的大小:

int bytesRead = recvfrom(m_socketId, (char*)&header, Message::HeaderSize, MSG_PEEK, (struct sockaddr *)&fromAddr, &addrSize);  
但我一直收到系统错误10040:

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

有没有一种方法可以窥视乞讨的信息?
谢谢:)

考虑到是
65507
,您可以为所有
recvfrom()
调用分配一个64k的“反弹缓冲区”——一旦您复制了它,读取大小,分配一个新的缓冲区,并以正确的大小复制您的数据包

复制如此多的数据包有点浪费,但这样可以让您以适当的大小分配缓冲区


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

您可以尝试
wsarecvmg(…,MSG_PEEK)
。您将在结果中设置
MSG\u TRUNC
标志,但您还应该具有所需的头字节。

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

消息太大,无法放入buf参数指向的缓冲区,因此被截断


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

+1这是常见的模式,我不知道在windows中,但在某些操作系统中,仅读取部分消息将丢弃其余消息,因此常见模式尝试读取64k(将返回消息实际花费的金额)@David:我希望
MSG_PEEK
标志可以防止任何东西被丢弃。