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

时间:2011-03-17 15:01:03

标签: linux network-programming

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

           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));
                 }
              }
           }

与此同时,我编写了一个发送UDP消息的Windows客户端。我已经使用wireshark验证了消息以正确的格式和长度(五个字节)传输。但是,当我检查recvfrom()的返回值时,此值始终为1。我的接收缓冲区(max_datagram_size)的大小设置为1024.我们获得的数据包的一个字节似乎具有正确的值。我的问题是:为什么我没有得到所有预期的字节?

如果重要,我的Linux服务器在VirtualBox虚拟机中的Debian 5下运行。

1 个答案:

答案 0 :(得分:0)

在第一条评论中回答了我的问题。我使用了错误的变量来报告缓冲区长度。