【问题标题】:UDP packages aren't recieved compleatly, recvfrom returns always 1UDP 包没有完全接收,recvfrom 总是返回 1
【发布时间】:2021-01-12 16:27:40
【问题描述】:

我正在尝试处理一些 UDP 包。打开套接字等效果很好,我得到了包,我得到了源 IP 和端口。端口设置在 m_port 中,IP 设置在 m_ipfilter 中。但是 recvfrom 总是返回 1。我的代码基本上是示例代码,根据 wireshark 有长度为 998 的包传入。有人知道我做错了什么吗?缓冲区目前为 2k 长。

   struct sockaddr_in server, from;
    int sock, flen = sizeof(from);
    char buf[BUFLEN];

    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    {
        std::cerr << "Couldn't open socket: " << strerror(errno) << ", errno: " << errno << std::endl;
        return;
    }
    memset((char *)&server, 0, sizeof(server)); //zero the structure
    server.sin_family = AF_INET;
    server.sin_port = htons(m_port);
    server.sin_addr.s_addr = htonl(m_ipfilter); //zero is recive on any adrress, INADDR_ANY=0
    if (bind(sock, (struct sockaddr *)&server, sizeof(server)) == -1)
    {
        std::cerr << "Couldn't bind socket on port: " << m_port << " : " << strerror(errno) << ", errno: " << errno << std::endl;
        return;
    }
    while (1)
    {
        ssize_t recv_len = 0;
        if (recv_len = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&from, (socklen_t *)&flen) != -1) //there is data
        {
            processOutput(buf, recv_len, from, (socklen_t)flen);
        }
    }

【问题讨论】:

    标签: c++ udp


    【解决方案1】:

    条件recv_len = recvfrom(...) != -1 被视为recv_len = (recvfrom(...) != -1)

    这会将recv_len分配给比较结果,因此如果recvfrom的返回值不是-1,它将变为1,如果返回值为-1,则变为0

    条件应该是(recv_len = recvfrom(...)) != -1。添加括号将recvfrom的返回值与-1进行比较,而不将比较结果分配给recv_len

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2015-05-23
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多