我在局域网中有两台机器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
?
对于后续数据报,可以获得有效信息。
答案 0 :(得分:6)
在致电recvfrom
之前,您必须正确初始化len
参数。
E.g。
len = sizeof(struct sockaddr_in);
n = recvfrom(..., &len);
recvfrom
函数使用长度来帮助确定sockaddr
指针实际指向的结构类型。