奇怪的客户端地址返回通过接受(..)功能

问题描述:

我是一个套接字编程新手。这里有一个片段:奇怪的客户端地址返回通过接受(..)功能

struct sockaddr_storage client_addr; 

... 

client_addr_size = sizeof(client_addr); 
client_socket = accept(server_socket, 
    (struct sockaddr *)&client_addr, &client_addr_size); 

... 

result = inet_ntop(AF_INET, 
    &((struct sockaddr_in *)&client_addr)->sin_addr, 
    client_addr_str, sizeof(client_addr_str)); 

我正在作为服务器工作。无论何时,无论主机如何,客户端连接的地址都是0.0.0.0。任何人都可以解释,我做错了什么?

谢谢。

检查client_addr.ss_family - 可以返回一个AF_INET6家庭住址。

+0

是的,那是对的。我已经解决了这个问题。还有一个人会兴奋起来。我在提示中使用带AI_PASSIVE的getaddrinfo函数。 我稍后将地址绑定到is ::。好吗? – 2010-03-22 20:12:54

+0

是的,没关系(只要套接字仍然是'AF_INET6')。 – caf 2010-03-22 21:24:08

您可以显示更多的代码...您尝试连接到什么IP地址/服务?

的线索是在IP地址本身,0.0.0.0,通常其中一个网络接口都没有分配IP地址的情况,可能是在寻找一个DHCP服务器更新/接受来自某处DHCP租约..

由于您没有提供足够的信息,我正在拍摄自己的脚,因此被认为是不公平的,因此得不到满意的结果,因为这个答案不能满足您的问题!

+0

他没有把*连接到*任何东西;他充当服务器并接受连接。 – 2010-03-21 13:41:18

只是猜测 - 什么是client_addr_str的声明?如果是char*然后sizeof(client_addr_str)将返回指针的大小(4或8,根据32位或64位平台。)请尝试以下操作:

char client_addr_str[INET_ADDRSTRLEN]; 
if (inet_ntop(AF_INET, 
    &((struct sockaddr_in *)&client_addr)->sin_addr, 
    client_addr_str, INET_ADDRSTRLEN) == NULL) 
{ 
    /* complain */ 
}