首先,我的代码示例:
cout << "bla1" << endl;
struct addrinfo hints, *info;
int status;
memset(&hints, 0, sizeof hints);
char ip4[INET_ADDRSTRLEN];
char ip6[INET6_ADDRSTRLEN];
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
cout << "bla2" << endl;
status = getaddrinfo(url.c_str(), NULL, &hints, &info);
cout << "bla3" << endl;
if(!inet_ntop(AF_INET, &((const sockaddr_in *)info->ai_addr)->sin_addr , ip4, INET_ADDRSTRLEN)) {
return ERROR_PAR;
}
cout << "bla4" << endl;
url变量包含要解析的地址(我正在使用简单的客户端/服务器DNS解析器)。如果可以解析,则一切正常,但是当无法解析网址时,我的输出仅为
bla1
bla2
bla3
上面的代码在派生的子代中,因此它不会停止整个脚本,它只是返回到父进程,尽管没有错误(我正在测试返回值,在这种情况下,它应该是ERROR_PAR = 1,因此错误消息应出现)。
我使用这些功能的方式是否有问题,或者问题一定存在于其他地方?
编辑:重要的是要在任何其他函数之前检查getaddrinfo返回值。这样问题就解决了。
最佳答案
要正式回答此问题,请查看手册:
成功时,inet_ntop()返回指向dst的非空指针。如果存在错误,则返回NULL,并设置errno表示错误。
因此,您将执行以下操作:
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(void) {
char *ip = "127.0.0.1";
uint32_t src;
inet_pton(AF_INET, ip, &src);
char dst[INET_ADDRSTRLEN];
if (inet_ntop(AF_INET, &src, dst, INET_ADDRSTRLEN)) {
printf("converted value = %s \n", dst);
return 0;
} else {
printf("inet_ntop conversion error: %s\n", strerror(errno));
return 1;
}
}
关于c++ - 如何处理inet_ntop()失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9603273/