在 C 中获取所有 IP 地址
Get all IP-Addresses in C
我有以下问题。我必须用 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[INET_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);
}
}
hostent
的 h_addr_list
成员是一个以 NULL 结尾的指向 char* 的指针数组(因此它的双指针)。我的例子展示了如何遍历它。希望对你有帮助。
至于这段明显有味道的代码
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
这是获取地址列表中第一个条目的一种非常难读的方法。
我有以下问题。我必须用 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[INET_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);
}
}
hostent
的 h_addr_list
成员是一个以 NULL 结尾的指向 char* 的指针数组(因此它的双指针)。我的例子展示了如何遍历它。希望对你有帮助。
至于这段明显有味道的代码
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
这是获取地址列表中第一个条目的一种非常难读的方法。