【问题标题】:How to handle inet_ntop() failure?如何处理 inet_ntop() 失败?
【发布时间】:2012-03-07 14:27:33
【问题描述】:

首先,我的代码示例:

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 解析器)。如果可以解决,一切正常,但是当url无法解析时,我的输出只有

bla1 bla2 bla3

上面的代码在 fork child 所以它不会停止整个脚本,它只是返回到父进程,虽然没有错误(我正在测试返回值,在这种情况下它应该是 ERROR_PAR = 1所以应该会出现错误消息)。

我使用这些功能的方式有问题还是问题一定出在其他地方?

编辑:在任何其他函数之前检查 getaddrinfo 返回值很重要。这样问题就解决了。

【问题讨论】:

  • 函数失败时你检查过errno吗?它应该给你一个错误代码,告诉你失败的原因。
  • 另外,你确定getaddrinfo返回的第一个地址是IPv4地址吗?
  • 哦,我怎么会忘记检查 getaddrinfo 返回值呢?我试图在这里以错误的方式解决它。谢谢,问题已“解决”!

标签: c++ getaddrinfo inet-ntop


【解决方案1】:

要正式回答这个问题,请查看手册:

成功时,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;
    }
}

【讨论】:

    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多