首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gethostbyname()不工作

gethostbyname()不工作
EN

Stack Overflow用户
提问于 2013-11-23 19:21:44
回答 1查看 3.7K关注 0票数 0

我试图找到我的线人的IP,但它是行不通的。

代码语言:javascript
复制
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);
}

主要职能:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    struct hostent *sourceHostent       = NULL;
    struct hostent *destinationHostent  = NULL;
    struct ip *ip                       = NULL;

    getSourceIp(sourceHostent,ip);
    return 0;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-23 20:19:33

正如我在关于这个问题的评论中提到的,您的方法有几个问题。第一种情况是,结果不会被传递回调用函数。您需要使用一个双指针来完成此操作。

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

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

在没有看到更多代码的情况下,我不知道您要用struct ip做什么。看起来,您试图以char *的形式获取主机的一个或多个IP地址,但您却以相当大的速度错过了该目标。我可以提供更多的帮助,如果你能详细说明的意图。

最后一篇文章是风格化的,但是在if语句中执行赋值很容易出错,这通常是个糟糕的主意。你应该改掉做这件事的习惯。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20166758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档