Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
recvfrom()始终返回零远程地址_C_Sockets_Unix_Udp_Datagram - Fatal编程技术网

recvfrom()始终返回零远程地址

recvfrom()始终返回零远程地址,c,sockets,unix,udp,datagram,C,Sockets,Unix,Udp,Datagram,我正在编写一个简单的udp服务器应用程序,在尝试获取远程连接用户的地址时遇到了一个错误 while(run == 1) { struct sockaddr_in client_addr; char message[1024]; int len = recvfrom(sockfd, message, 1024, 0, (struct sockaddr*)&client_addr, sizeof client_addr); printf("Received

我正在编写一个简单的udp服务器应用程序,在尝试获取远程连接用户的地址时遇到了一个错误

while(run == 1) {
    struct sockaddr_in client_addr;
    char message[1024];
    int len = recvfrom(sockfd, message, 1024, 0, (struct sockaddr*)&client_addr, sizeof client_addr);

    printf("Received request from: %s#%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
}

它总是返回远程地址:0.0.0.0#0

如果您阅读
recvfrom
的文档,您会看到最后一个参数是指向保存地址大小的socklen的指针

因此,它应该是:

socklen_t client_addr_len = sizeof client_addr;
int len = recvfrom(....., (struct sockaddr*)&client_addr, &client_addr_len);

调用
recvfrom
后,
client\u addr\u len
将保留实际地址长度(如果不是AF\u INET地址,理论上可能小于缓冲区)。

调用
recvfrom()
的最后一个参数不正确。它应该是
socklen\u t*
类型的指针,指向最初存储地址大小的位置。函数修改存储在那里的值,以反映地址结构的实际大小,如它写入地址结构时,或初始大小足够大时,它将写入地址结构时的大小。而是传递实际大小,该大小必须隐式转换为指针。你的编译器应该警告你这一点


如果程序没有崩溃,
recvfrom()
必须从转换后的整数指向的地址中成功读取一个值,并在该地址中成功写入一个值。很可能,它正在读取值
0

,最后一个参数应该是指针。它是否还返回了-1并将errno设置为EFAULT?它返回了-1,错误消息是:错误的地址,代码甚至不应该编译。您是否在许可模式下编译?你不应该!它返回-1,错误消息是:地址不正确,这就是为什么您总是检查返回代码。