3

或多或少是它在标题中所说的。我打电话给 getaddrinfo,如下所示:

struct addrinfo crossplat, *actual_addr;
crossplat.ai_family = AF_UNSPEC; //IPv4 or IPv6.
crossplat.ai_socktype = SOCK_STREAM; 

if(int i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)!=0){
    cerr << "error code " << i << " received. Meaning: "<<  gai_strerror(i) << endl;
    return -1;
}

自豪地打印:

error code 1 received. Meaning: Unknown error

在我的系统上。

我系统上的 getaddrinfo 手册页:

RETURN VALUE
   getaddrinfo() returns 0 if it succeeds, or one of the following 
   nonzero error codes:

   EAI_ADDRFAMILY....


   ...The gai_strerror() function translates these error codes to a 
       human readable string, suitable for error reporting.

这表明 getaddrinfo 返回的所有非零代码都应该是列出的 EAI_* 系列代码之一。在线搜索表明 gai_strerror() 仅在传递一个不是EAI_* 系列成员的错误代码时才会返回“未知错误” ,这似乎排除了“1”是这样的代码。

显然我在这里做错了,所以任何帮助将不胜感激!

4

3 回答 3

7

此表达式是 C 中的语法错误,但假设您使用的是 C++,它并没有按照您的期望进行分组:

if (int i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)!=0){

这将分配getaddrinfo("localhost", "8000", &crossplat, &actual_addr) != 0to的结果i,它始终为 0 或 1。任何非零返回 bygetaddrinfo()将离开i值为 1。

您需要提前声明i,以便您可以对分配进行附加说明:

int i;
if ((i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)) != 0) {

(当然,完成此操作后,您可能还会将getaddrinfo()调用移至 的初始化程序i)。

于 2012-11-15T11:14:30.483 回答
2

我认为您需要初始化crossplat.ai_protocol. 除了您已经初始化的成员之外, hints参数的手册页部分还提到了这一点。addrinfo

您可能还需要初始化crossplat.ai_flags. 只对整个结构进行 memset 可能会更容易:

struct addrinfo crossplat, *actual_addr;
memset(&crossplat, 0, sizeof(crossplat));
crossplat.ai_family = AF_UNSPEC; //IPv4 or IPv6.
crossplat.ai_socktype = SOCK_STREAM;
于 2012-11-15T10:53:34.727 回答
1

getaddrinfo.h:#define EAI_ADDRFAMILY 1中,这意味着:不支持主机名的地址族

于 2012-11-15T10:55:29.673 回答