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



我在局域网中有两台机器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 = 
 "00000000000000"}

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

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

在调用recvfrom之前,必须正确初始化len参数。

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

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