在 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);
  }
}

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

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

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

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