gethostbyname()不起作用

时间:2013-11-23 19:21:45

标签: c host gethostbyname

我正在尝试找到我的来源的知识产权,但它还没有成功。

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);
}

MAIN功能:

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

    getSourceIp(sourceHostent,ip);
    return 0;
}

我得到的输出是&#34;源macbook是未知的。&#34;

1 个答案:

答案 0 :(得分:2)

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

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

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

如果没有看到更多代码,我不确定您要对struct ip做什么。看起来您正在尝试将主机的一个或多个IP地址设为char *,但您已经错过了相当数量的目标。如果您能详细说明意图,我可以提供更多帮助。

最后一篇文章是风格化的,但在if语句中进行分配是容易出错的,而且通常是个坏主意。你应该养成这样做的习惯。