Joh*_*tte 2 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;
}
Run Code Online (Sandbox Code Playgroud)
自豪地印刷:
error code 1 received. Meaning: Unknown error
Run Code Online (Sandbox Code Playgroud)
在我的系统上.
我系统上的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.
Run Code Online (Sandbox Code Playgroud)
这告诉我getaddrinfo返回的所有非零代码都应该是列出的EAI_*系列代码之一.在线搜索表明gai_strerror()只会在传递错误代码时返回"未知错误",该错误代码不是 EAI_*系列的成员,这似乎排除了"1"这样的代码.
显然我在这里做了一些相当错误的事情,所以非常感谢任何帮助!
这个表达式是C中的语法错误,但假设您使用的是C++,那么它的分组并不是您所期望的:
if (int i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)!=0){
Run Code Online (Sandbox Code Playgroud)
这将分配getaddrinfo("localhost", "8000", &crossplat, &actual_addr) != 0to 的结果,该结果i始终为0或1.任何非零返回值getaddrinfo()将保留i值1.
您需要提前声明i,以便您可以对作业进行限制:
int i;
if ((i = getaddrinfo("localhost", "8000", &crossplat, &actual_addr)) != 0) {
Run Code Online (Sandbox Code Playgroud)
(当然,完成此操作后,您可能还会将getaddrinfo()调用移至初始化程序i).