Linux 为什么recvfrom()会在数据包大小下报告?
我正在一台Linux服务器上工作,该服务器作为发现协议的一部分侦听UDP消息。我的听力代码如下:Linux 为什么recvfrom()会在数据包大小下报告?,linux,network-programming,Linux,Network Programming,我正在一台Linux服务器上工作,该服务器作为发现协议的一部分侦听UDP消息。我的听力代码如下: rcd = ::select( socket_handle + 1, &wait_list, 0, // no write 0, // no error &timeout);
rcd = ::select(
socket_handle + 1,
&wait_list,
0, // no write
0, // no error
&timeout);
if(rcd > 0)
{
if(FD_ISSET(socket_handle,&wait_list))
{
struct sockaddr address;
socklen_t address_size = sizeof(address);
len = ::recvfrom(
socket_handle,
rx_buff,
max_datagram_size,
0, // no flags
&address,
&address_size);
if(len > 0 && address.sa_family == AF_INET)
{
struct sockaddr_in *address_in =
reinterpret_cast<struct sockaddr_in *>(&address);
event_datagram_received::cpost(
this,
rx_buff,
rcd,
ntohl(address_in->sin_addr.s_addr),
ntohs(address_in->sin_port));
}
}
}
同时,我还编写了一个windows客户端,用于传输UDP消息。我已经使用wireshark验证了消息的传输格式和长度是否正确,是否为5个字节。但是,当我检查recvfrom的返回值时,该值始终为1。我的接收缓冲区最大数据报大小设置为1024。我们得到的数据包的一个字节似乎具有正确的值。我的问题是:为什么我没有得到所有预期的字节
如果有必要,我的Linux服务器在VirtualBox虚拟机中的Debian 5下运行 nos在第一条评论中回答了我的问题。我使用了错误的变量来报告缓冲区长度。在代码中,您在哪里看到长度为1?您的event_datagram_received::cpost似乎没有处理len变量?max_datagram_大小是1还是5?您能否演示如何在发送方和接收方中设置套接字?nos的评论非常正确,我觉得非常愚蠢。我使用的是select的返回值,而不是recvfrom的返回值。如果将该说明作为答复,我将乐意接受。