【问题标题】:gethostbyname() not workinggethostbyname() 不工作
【发布时间】:2013-11-23 19:21:44
【问题描述】:

我正在尝试查找来源的 IP,但它不起作用。

void getSourceIp(struct hostent *sourceHost, struct ip *ipStruct)
{
    char sourceName[100];

    if (gethostname(sourceName,sizeof(sourceName)) < 0)
    {
        perror("Error in function gethostname().\n");
        exit(EXIT_FAILURE);
    }

    if ((sourceHost = gethostbyname(sourceName)) == NULL)
    {
        std::cout << "The source " << sourceName << " is unknown.\n";
        exit(EXIT_FAILURE);
    }

    ipStruct->ip_src = (*(struct in_addr *) sourceHost->h_addr_list);
    std::cout << "IP Address: " << inet_ntoa(ipStruct->ip_src);
}

主要功能:

int main(int argc, char *argv[])
{
    struct hostent *sourceHostent       = NULL;
    struct hostent *destinationHostent  = NULL;
    struct ip *ip                       = NULL;

    getSourceIp(sourceHostent,ip);
    return 0;
}

我得到的输出是“源 macbook 未知。”

【问题讨论】:

  • "gethostbyname() not working" - 可能是这样,但您的期望与它的行为不符。
  • 什么意思? @H2CO3
  • 对不起,我忘了完成我的评论...>。
  • /etc/hosts 中是否存在名为“macbook”的行?尝试使用完全限定名称,例如 macbook.localnet 或类似名称。也可以尝试使用已知的主机名,例如“stackoverflow.com”,看看它是否可以解决它。
  • gethostbyname 返回的名称可能不在您的 DNS 中。您应该考虑改用getifaddrs

标签: c host gethostbyname


【解决方案1】:

正如我在问题的 cmets 中提到的,您的方法有几个问题。第一个是结果不会传递回调用函数。您需要使用双指针来执行此操作。

接下来,从gethostbyname返回的值被分配在静态内存中,所以下次调用函数时可以覆盖它。您需要将结果复制到自己的内存中。这很重要,因为您需要对其进行深度复制,而不仅仅是malloc(sizeof(struct hosting))。这样做的复杂性是gethostbyname 被贬值的原因。根据您的目标平台,有更好的选择来进行 DNS 查找。

即使在您的代码中查找成功,您也会得到一个 SEGFAULT。您正在为ipStruct 传递值NULL,然后尝试取消引用并写入它。如果你取消引用一个 NULL 指针,你将会有一段糟糕的时光。您应该花一些时间来了解 C 中使用 mallocfree 的内存管理。

没有看到更多代码,我不确定你想用你的struct ip 做什么。看起来您正试图获取主机的一个或多个 IP 地址为char *,但您已经大大错过了该目标。如果您能详细说明意图,我可以提供更多帮助。

这最后一段是风格化的,但在if 语句中进行赋值很容易出错,而且通常是个坏主意。你应该改掉这样做的习惯。

【讨论】:

  • 我正在尝试实现 ping。我必须获取源 IP 地址和目标 IP 地址并发送一些 ICMP 回显请求。非常感谢。哦,我用的是 macbook。
  • 为什么要实施 Ping?它已经存在。您是否正在尝试做一些不同的事情,或者这是一个学习练习?如果是学习练习,解决方案有哪些限制(UI、可用库、支持的平台等)?
  • 这是我电脑网络的作业。可用的库是 C/C++ 的,它现在应该可以在我的 mac 上运行。
  • 最终的应用程序应该类似于 linux 中的 mtr 命令,但现在我只是尝试发送一些 icmp 请求。我正在用 Qt 写作,但我不允许使用 Qt 库,甚至对于套接字也不行。我将使用原始的,最后我还将为程序制作一个 UI。
  • 如果你对这个话题感兴趣,Stevens 有一本很棒的书。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多