recvfrom()始终返回零远程地址
我正在编写一个简单的udp服务器应用程序,在尝试获取远程连接用户的地址时遇到了一个错误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
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,错误消息是:地址不正确,这就是为什么您总是检查返回代码。