【发布时间】:2010-06-08 17:19:45
【问题描述】:
我目前正在 linux 中编写一个小型 UDP 服务器程序。 UDP 服务器将从两个不同的对等点接收数据包,并将根据从哪个对等点接收数据包执行不同的操作。我正在尝试确定接收数据包的来源。但是,当select 返回并调用recvfrom 时,它会返回Invalid Argument 错误。如果我将 NULL 作为倒数第二个参数传递,则 recvfrom 成功。
我尝试将 fromAddr 声明为struct sockaddr_storage、struct sockaddr_in、struct 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。在输出时,它将返回填充的字节数。