Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么recvfrom()会在数据包大小下报告?_Linux_Network Programming - Fatal编程技术网

Linux 为什么recvfrom()会在数据包大小下报告?

Linux 为什么recvfrom()会在数据包大小下报告?,linux,network-programming,Linux,Network Programming,我正在一台Linux服务器上工作,该服务器作为发现协议的一部分侦听UDP消息。我的听力代码如下: rcd = ::select( socket_handle + 1, &wait_list, 0, // no write 0, // no error &timeout);

我正在一台Linux服务器上工作,该服务器作为发现协议的一部分侦听UDP消息。我的听力代码如下:

           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的返回值。如果将该说明作为答复,我将乐意接受。