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

3

我在局域网中有两台机器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结构体呢?

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


后续数据报包含有效信息吗? - Joe
1个回答

6
在调用recvfrom之前,您必须正确初始化len参数。
例如:
len = sizeof(struct sockaddr_in);
n = recvfrom(..., &len);
< p > < code > recvfrom 函数使用长度来帮助确定 < code > sockaddr 指针实际指向哪种结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接