Linux系统调用:getaddrinfo返回-2

我正在使用系统调用getaddrinfo,它返回-2。 我试图知道这是什么错误,并得到这是“名称或服务不知道”。 这个名字 – 这是我的主机名,我确定它是已知的。 但是服务是一个从运行到运行的数字。 我怎么知道我正在带来正确的参数?

我的代码:

int GetSockPeerIPs(int sock, AddressList &addresses, int &error, int family, bool zeroport) { struct sockaddr_storage ss; socklen_t salen = sizeof(ss); struct sockaddr *sa; struct addrinfo hints, *paddr, *paddrp; sa = (struct sockaddr *)&ss; if (getpeername(sock, sa, &salen) != 0) { error = errno; return -1; } char hbuf[NI_MAXHOST]; char pbuf[NI_MAXSERV]; if (0 != (error = getnameinfo(sa, salen, hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), 0))) { return -1; } memset(&hints, 0, sizeof(hints)); if (ATNetworkTool::AF_XINETX == family) { hints.ai_family = PF_UNSPEC; } else { hints.ai_family = family; } hints.ai_socktype = SOCK_STREAM; if (0 != (error = getaddrinfo(hbuf, pbuf, &hints, &paddrp))) { return -1; } addresses.clear(); for (paddr = paddrp; paddr; paddr = paddr->ai_next) { if (ATNetworkTool::AF_XINETX == family) { if (!ATAddress::saIsInet(paddr->ai_addr)) { continue; } } if (zeroport) { addresses.insert(ATAddress(paddr->ai_addr, 0)); } else { addresses.insert(paddr->ai_addr); } } freeaddrinfo(paddrp); return 0; } 

谢谢! GLN

你有一个错误代码。 你有没有想过找出它的意思? 这次我已经为你做了。 但是,这是我做的,所以下次你可以自己看看。

看看getaddrinfo()的手册页我发现它可以返回一些错误代码,例如EAI_AGAIN。 数值将在某个头文件中定义,所以我做了

 cd /usr/include find . -name "*.h" -exec grep -l EAI_AGAIN {} \; 

这确定了netdb.h。 所以我在vi中打开它,这就是它所说的:

 # define EAI_BADFLAGS -1 /* Invalid value for `ai_flags' field. */ # define EAI_NONAME -2 /* NAME or SERVICE is unknown. */ # define EAI_AGAIN -3 /* Temporary failure in name resolution. */ # define EAI_FAIL -4 /* Non-recoverable failure in name res. */ # define EAI_FAMILY -6 /* `ai_family' not supported. */ # define EAI_SOCKTYPE -7 /* `ai_socktype' not supported. */ # define EAI_SERVICE -8 /* SERVICE not supported for `ai_socktype'. */ # define EAI_MEMORY -10 /* Memory allocation failure. */ # define EAI_SYSTEM -11 /* System error returned in `errno'. */ # define EAI_OVERFLOW -12 /* Argument buffer overflow. */ 

所以基本上,你传入的名字或者服务是getaddrinfo所不知道的。 我会检查前两个参数是否合理,如果我是你。

getaddrinfo对数据的格式很挑剔,在解析配置文件时要确保没有多余的空格,通常在主机名参数后面有空格,否则会出现这个错误,在这种情况下错误是正确的,只是没有多少信息。