我有以下问题。我必须在语言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分配给我的变量。 我需要知识产权才能找到我公司所在的位置。我需要172 ...
现在我可以在winsock2.h中找到* hostinfo-> h_addr_list包含IP地址列表。如何将172.地址分配给我的IP_Variable?
提前感谢您的帮助!
编辑: 只是为了澄清:我不想拥有我的外部IP地址。我需要我的内部。
答案 0 :(得分:1)
以下是我在linux
上测试的示例。直到明天我才能访问Windows系统,但如果需要,可以测试并更新答案。
只有在开始时没有WSAStartup
调用的情况下,它与Windows版本相当。
#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);
}
}
h_addr_list
的{{1}}成员是一个以NULL结尾的char *指针数组(因此它的双指针)。我的例子展示了如何遍历这个。希望它有所帮助。
至于这个明显有点臭的代码
hostent
这是在地址列表中获取第一个条目的一种非常难以理解的方式。