什么可能导致getaddrinfo()返回错误代码“1”?

时间:2012-11-15 10:48:49

标签: c network-programming berkeley-sockets

或多或少在标题中说的内容。我这样打电话给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”就是这样代码。

显然我在这里做了一些相当错误的事情,所以非常感谢任何帮助!

3 个答案:

答案 0 :(得分:7)

这个表达式是C中的语法错误,但假设你使用的是C ++,它没有按你期望的方式分组:

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

这会将getaddrinfo("localhost", "8000", &crossplat, &actual_addr) != 0的结果分配给i,该结果始终为0或1. getaddrinfo()之前的任何非归零都会为i留下值1。

您需要提前声明i,以便您可以对作业进行限制:

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

(当然,完成此操作后,您可能还会将getaddrinfo()调用移至i的初始值设定项。

答案 1 :(得分:2)

我认为你需要初始化crossplat.ai_protocol提示参数的man page部分提到除了您已初始化的addrinfo成员之外还会使用此部分。

您可能还需要初始化crossplat.ai_flags。简单地记住整个结构可能更容易:

struct addrinfo crossplat, *actual_addr;
memset(&crossplat, 0, sizeof(crossplat));
crossplat.ai_family = AF_UNSPEC; //IPv4 or IPv6.
crossplat.ai_socktype = SOCK_STREAM;

答案 2 :(得分:1)

getaddrinfo.h#define EAI_ADDRFAMILY 1中,表示:不支持主机名的地址系列