或多或少它在标题中所说的。我有一个电话给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"是这样的代码。
显然我在这里做错了什么,所以任何帮助将不胜感激!
此表达式是 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
的初始值设定项)。
您需要初始化crossplat.ai_protocol
. 提示参数的手册页部分提到,除了已初始化的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;
在getaddrinfo.h
中:#define EAI_ADDRFAMILY 1
,这意味着:不支持主机名的地址家族