【问题标题】:Why would recvfrom() under report the packet size?为什么 recvfrom() 会报告数据包大小?
【发布时间】:2011-03-18 04:44:38
【问题描述】:

我正在使用作为发现协议的一部分侦听 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 的长度?您的 event_datagram_received::cpost 似乎没有处理 len 变量?
  • max_datagram_size 1 还是5?
  • 你能说明你是如何在发送者和接收者中设置套接字的吗?
  • nos 的评论很中肯,我觉得很傻。我使用的是 select() 的返回值,而不是 recvfrom() 的返回值。如果要形成该注释作为答案,我将很乐意接受。

标签: linux network-programming


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2015-10-18
    • 2018-01-23
    • 1970-01-01
    相关资源
    最近更新 更多