0

我正在尝试查找我的来源的 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 未知”。

4

1 回答 1

2

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

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

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

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

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

于 2013-11-23T20:19:33.013 回答