【问题标题】:recvfrom returns invalid argument when *from* is passed当 *from* 被传递时 recvfrom 返回无效参数
【发布时间】:2010-06-08 17:19:45
【问题描述】:

我目前正在 linux 中编写一个小型 UDP 服务器程序。 UDP 服务器将从两个不同的对等点接收数据包,并将根据从哪个对等点接收数据包执行不同的操作。我正在尝试确定接收数据包的来源。但是,当select 返回并调用recvfrom 时,它会返回Invalid Argument 错误。如果我将 NULL 作为倒数第二个参数传递,则 recvfrom 成功。

我尝试将 fromAddr 声明为struct sockaddr_storagestruct sockaddr_instruct sockaddr,但没有成功。他们的代码有问题吗?这是确定数据包来源的正确方法吗?

代码 sn-p 如下。

`           
    /*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);
    }

`

【问题讨论】:

  • 在调用 recvfrom() 之前,是否将 addrLen 设置为 fromAddr 的字节大小?它需要知道有多少字节可供它使用对等信息填充 fromAddr。在输出时,它将返回填充的字节数。

标签: linux sockets


【解决方案1】:

您必须在调用recvfrom() 之前将addrLen 初始化为sizeof fromAddr - 它是一个输入/输出参数。使用struct sockaddr_storage 声明fromAddr 是正确的。

【讨论】:

  • 谢谢,就是这样。傻我。
【解决方案2】:

我遇到了同样的问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多