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

发布于 2024-10-24 05:03:55 字数 1530 浏览 3 评论 0原文

我正在开发一个 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));
                 }
              }
           }

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

以防万一,我的 Linux 服务器在 VirtualBox 虚拟机中的 Debian 5 下运行。

I am working on a Linux server that listens for UDP messages as part of a discovery protocol. My code for listening follows:

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

In the meantime, I have written a windows client that transmits the UDP messages. I have verified using wireshark that the messages are being transmitted with the right format and length (five bytes). However, when I examine the return value for recvfrom(), this value is always one. The size of my receive buffer (max_datagram_size) is set to 1024. The one byte of the packet that we get appears to have the correct value. My question is: why am I not getting all of the expected bytes?

In case it matters, my Linux server is running under Debian 5 within a VirtualBox virtual machine.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤芳又自赏 2024-10-31 05:03:55

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

nos answered my question in the first comment. I was using the wrong variable to report the buffer length.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文