gpt4 book ai didi

c - 获取C中的所有IP地址

转载 作者:行者123 更新时间:2023-11-30 15:22:52 28 4
gpt4 key购买 nike

我遇到以下问题。我必须用 C 语言为 Pidgin 编写一个插件。我对 C 完全陌生。我找到了以下代码。

  WORD wVersionRequested;
WSADATA wsaData;
char name[255];
char* ip;
PHOSTENT hostinfo;
wVersionRequested = MAKEWORD( 2, 0 );

if ( WSAStartup( wVersionRequested, &wsaData ) == 0 ) {
if( gethostname ( name, sizeof(name)) == 0) {
if((hostinfo = gethostbyname(name)) != NULL) {
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
}
}
WSACleanup( );
}

我有IP地址172.28.52.220但由于我的 VMWare,我也有 IP 10.0.1.3。现在,在我的插件中,IP 10.0.1.3 已分配给我的变量。我需要 IP 来找出我所在公司的位置。我需要 hte 172...

现在我可以在winsock2.h中找到*hostinfo->h_addr_list包含Ip地址列表。如何将 172. 地址分配给我的 IP_Variable?

预先感谢您的帮助!

<小时/>

编辑:只是为了澄清:我不想拥有我的外部 IP 地址。我需要我的内部结构。

最佳答案

这是我在 linux 上测试的示例。直到明天我才能访问 Windows 系统,但如果需要,可以测试和更新答案。

它与 Windows 版本相当,只是开头没有调用 WSAStartup

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>

int main()
{
char hostnamebuff[100];

if(gethostname(hostnamebuff, 100) == 0)
{
struct hostent* hostinfo = gethostbyname(hostnamebuff);
printf("host name is %s\n", hostnamebuff);

if(hostinfo != NULL)
{
char** paddrlist = hostinfo->h_addr_list;

printf("host list is\n");
while(*paddrlist != NULL)
{
char addrbuff[INET6_ADDRSTRLEN];
if(inet_ntop(hostinfo->h_addrtype, *paddrlist, addrbuff, hostinfo->h_addrtype == AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN))
{
printf("%s\n", addrbuff);

if(strncmp(addrbuff, "172.", 4) == 0)
{
printf("its a match\n");
break;
}
} else
{
printf("failed to convert an address\n");
}
paddrlist++;
}
} else
{
printf("failed on gethostbyname\n");
}
} else
{
printf("failed on gethostname errno=%d\n", errno);
}
}

hostenth_addr_list 成员是一个 NULL 终止的指向 char* 的指针数组(因此它是双指针)。我的例子展示了如何遍历它。希望对您有所帮助。

至于这段明显有臭味的代码

ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);

这是获取地址列表中第一个条目的一种非常不可读的方式。

关于c - 获取C中的所有IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29006071/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com