获取C中的所有IP地址

时间:2015-03-12 09:33:16

标签: c winsock

我有以下问题。我必须在语言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地址。我需要我的内部。

1 个答案:

答案 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

这是在地址列表中获取第一个条目的一种非常难以理解的方式。