代码之家  ›  专栏  ›  技术社区  ›  Aditya Sehgal

当传递*from*时,recvfrom返回无效参数

  •  6
  • Aditya Sehgal  · 技术社区  · 14 年前

    我目前正在linux中编写一个小型UDP服务器程序。UDP服务器将从两个不同的对等方接收数据包,并根据从哪个对等方接收数据包来执行不同的操作。我正在试图确定从何处接收数据包的来源。但是,什么时候 select recvfrom 调用时,返回一个错误

    我试着把fromAddr声明为 struct sockaddr_storage struct sockaddr_in , struct sockaddr 没有任何成功。他们的密码有问题吗?这是确定数据包来源的正确方法吗?

    下面是代码片段。

    `           
        /*TODO : update for TCP. use recv */
        if((pkInfo->rcvLen=recvfrom(psInfo->sockFd,
                                    pkInfo->buffer,
                                    MAX_PKTSZ,
                                    0,
                                   /* (struct sockaddr*)&fromAddr,*/
                                   NULL,
                                  &(addrLen)
                                  )) < 0)
        {
           perror("RecvFrom failed\n");
        }
        else
        {
           /*Apply Filter */
        #if 0
           struct sockaddr_in* tmpAddr;
           tmpAddr = (struct sockaddr_in* )&fromAddr;
           printf("Received Msg From %s\n",inet_ntoa(tmpAddr->sin_addr));
        #endif
          printf("Packet Received of len = %d\n",pkInfo->rcvLen);
        }
    
    `
    
    2 回复  |  直到 14 年前
        1
  •  21
  •   caf    14 年前

    你必须初始化 addrLen sizeof fromAddr 打电话之前 recvfrom() -它是一个输入/输出参数。使用 struct sockaddr_storage 宣布 fromAddr 是正确的。

        2
  •  1
  •   p.s.w.g    11 年前

    我也有同样的问题:

    Invalid arguments 'Candidates are: int recvfrom(int, void *, unsigned int, int,
                       sockaddr *, unsigned int *) '
    

    同一代码:

    recvfrom(sockFd, buffer, MAX_PKTSZ, 0, (struct sockaddr*)&fromAddr, &addrLen)
    

    我的错误是我用了普通的 int 键入而不是 unsigned int 对于 addrLen

    unsigned int addrLen;
    addrLen = sizeof(fromAddr);