我试图找到我的线人的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是未知的”。
发布于 2013-11-23 20:19:33
正如我在关于这个问题的评论中提到的,您的方法有几个问题。第一种情况是,结果不会被传递回调用函数。您需要使用一个双指针来完成此操作。
接下来,gethostbyname返回的值将在静态内存中分配,因此可以在下次调用该函数时覆盖它。您需要将结果复制到自己的内存中。这并不简单,因为您需要深入复制它,而不仅仅是malloc(sizeof(struct hosting))。这样做的复杂性是gethostbyname贬值的原因。根据您的目标平台,有更好的选择来进行DNS查找。
即使在您的代码中成功查找,您也会得到一个SEGFAULT。您正在传递用于NULL的值ipStruct,然后尝试取消引用并将其写入。如果您取消引用空指针,您将有一个糟糕的时间。您应该花一些时间使用malloc和free来理解C中的内存管理。
在没有看到更多代码的情况下,我不知道您要用struct ip做什么。看起来,您试图以char *的形式获取主机的一个或多个IP地址,但您却以相当大的速度错过了该目标。我可以提供更多的帮助,如果你能详细说明的意图。
最后一篇文章是风格化的,但是在if语句中执行赋值很容易出错,这通常是个糟糕的主意。你应该改掉做这件事的习惯。
https://stackoverflow.com/questions/20166758
复制相似问题