当收到第一个数据报时,recvfrom()不会填充结构`sockaddr`

时间:2013-04-09 10:01:43

标签: c network-programming

我在局域网中有两台机器A和B. 我在A上有一个UDP客户端 和B上的UDP服务器,如

for(;;){
    n = recvfrom(sockfd, mesg, 10000, 0, (struct sockaddr *)&cliaddr, &len);
    ....}

我注意到UDP客户端发送第一个数据报时 我可以通过mesg正确获取数据报数据有效负载 但结构cliaddr未填充,它与原始值
例如,如果我使用bzero(&cliaddr, sizeof(cliaddr));
gdb,我得到了

$1 = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = 
 "\000\000\000\000\000\000\000"}

收到第一个数据报的原因是什么,recvfrom()没有填充结构cliaddr

对于后续数据报,可以获得有效信息。

1 个答案:

答案 0 :(得分:6)

在致电recvfrom之前,您必须正确初始化len参数。

E.g。

len = sizeof(struct sockaddr_in);
n = recvfrom(..., &len);

recvfrom函数使用长度来帮助确定sockaddr指针实际指向的结构类型。