如何用C++编程获得某台机器的IP地址?

原创 2002年12月04日 08:57:00
对于这个古老的问题,VC知识库的精华区以及以往的在线杂志中都有详尽不一的描述。本文提供的方法是一个比较完整的解决方案,并附有详细的实现细节。希望大家对这个问题有彻底的认识。其实,如果你熟悉 Windows 的Sockets API,并了解一些底层的Winsock知识。那么要获得某台机器的IP地址并不是什么难事。一台机器可以装多块网卡,因此它就可能有多个IP地址。目前很多发烧友的PC机都装有多块网卡。其中一块网卡与调制解调器(MODEM)或者ADSL适配器相连,另一块与家里的局域网(LAN)相连。对于有宽带连接条件的家庭,这更是一种典型的配置。任何事情,一旦你知道了解决的方法,一切都会变得如此简单。下面是本文提供的一个简单的控制台程序(程序名为getip1),其功能就是显示本机的IP地址。如图一所示:


图一 getip1的运行画面

下面是 getip1 程序的代码,很简单:
////////////////////////////////////////////////////////////////
// getip1.cpp
//
// 本程序报告本机上每一块网卡的IP地址
// 命令行编译命令为:
//
// cl getip1.cpp wsock32.lib
//
// 请一定要在环境变量中正确指定LIB库的路径;可以运行vcvars32.bat
//
#include <winsock.h>
#include <wsipx.h>
#include <wsnwlink.h>
#include <stdio.h>

int main()
{
   ////////////////
   // 初始化 Windows sockets API. 要求版本为 version 1.1
   //
   WORD wVersionRequested = MAKEWORD(1, 1);
   WSADATA wsaData;
   if (WSAStartup(wVersionRequested, &wsaData)) {
      printf("WSAStartup failed %s/n", WSAGetLastError());
      return -1;
   }

   //////////////////
   // 获得主机名.
   //
   char hostname[256];
   int res = gethostname(hostname, sizeof(hostname));
   if (res != 0) {
      printf("Error: %u/n", WSAGetLastError());
      return -1;
   }
   printf("hostname=%s/n", hostname);
   ////////////////
   // 根据主机名获取主机信息. 
   //
   hostent* pHostent = gethostbyname(hostname);
   if (pHostent==NULL) {
      printf("Error: %u/n", WSAGetLastError());
      return -1;
   }
   //////////////////
   // 解析返回的hostent信息.
   //
   hostent& he = *pHostent;
   printf("name=%s/naliases=%s/naddrtype=%d/nlength=%d/n",
      he.h_name, he.h_aliases, he.h_addrtype, he.h_length);
   
   sockaddr_in sa;
   for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
      memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
      // 输出机器的IP地址.
      printf("Address: %s/n", inet_ntoa(sa.sin_addr)); // 显示地址串
   }
   //////////////////
   // 终止 Windows sockets API
   //
   WSACleanup();
   return 0;
}     
    要使用Winsock,首先必须调用WSAStartup,最后结束时不要忘了调用WSACleanup。要获取IP地址,首先必须得到机器的主机名(host name),调用gethostname就可以实现,有了主机名,接下来调用gethostbyname来获取包括IP地址在内的更多的主机信息。gethostbyname返回一个指向hostent数据结构的指针,这个结构在<winsock.h>文件中是这样定义的:
// 来自winsock.h
struct  hostent {
  char    FAR * h_name;            /* 正式的主机名*/
  char    FAR * FAR * h_aliases;   /* 别名列表*/
  short   h_addrtype;              /* 主机地址类型*/
  short   h_length;                /* 地址长度*/
  char    FAR * FAR * h_addr_list; /* 地址清单*/
};
    这是个典型的底层APIs使用的数据结构,很多人都不是很熟悉它。实际上,hostent是一个变长的数据结构,h_name是主机名,在例子程序中的值为 "zxn.hangwire.sdb"。没有别名(h_aliases)。h_addrtype是地址类型(或者也叫地址家族),在例子程序中的值为2(AF_INET = internet,其它内容参见winsock.h)。h_length是每一个地址的长度,以字节为单位。因为IP地址的长度是4个字节,所以在例子程序中的值为4,h_addr_list是地址数组的开始点,它们一个接着一个存放,结尾是一个null。每一个x.y.z.w数字占一个字节。为了将IP地址格式化为x.y.z.w的形式,必须将地址数组先拷贝到一个叫sockaddr的数据结构中,然后调用一个特殊的函数inet_ntoa。 图二是hostent 结构在内存中存放示意图:


图二 hostent 结构在内存中的存放示意图

相信以上的解释再辅以阅读代码,你以后不再会对hostent结构感到陌生。

现在.NET风靡一时,用C#语言编程也成为一种时尚,如果有谁想知道如何用C#来解决本文的问题,请参考精华区的相关内容:
C#编程如何获取某台机器的IP地址?


最后,顺祝编程愉快!

C++获取系统信息(IP地址、硬件信息等)

#include #include //该头文件需在windows.h之前 #include #include #include #pragma comment(lib,"ws2_32.lib") ...
  • lynch0571
  • lynch0571
  • 2014年05月02日 15:29
  • 2307

C++获取本机IP

  • 2017年09月04日 17:47
  • 12.25MB
  • 下载

c++获取本机ip地址

c实现主要是依赖于两个结构体 struct ifreq { #define IFHWADDRLEN 6 union { char ifrn_name[IFNAMSIZ]; /* if name, e....
  • chinabhlt
  • chinabhlt
  • 2015年04月27日 22:36
  • 1956

C++ 获取本机的Ip地址及主机名

下面是获取本机Ip和主机名的程序,在VC6下成功,注意连接静态库的方法,初始化SOCKET库函数的方法, 以及取得gethostname的方法。 代码如下: #include #inclu...
  • flywithmj
  • flywithmj
  • 2012年03月07日 11:02
  • 8179

windows C++获得本地IP地址

#include   #include using namespace std; string GetLocalIpAddress() { WORD wVersionRequested = ...
  • q277055799
  • q277055799
  • 2012年12月16日 14:29
  • 8980

使用C/C++获取本地机器IP的方法

2012-01-05 wcdj 方法1:getaddrinfo #include #include #include #include #include #include // inet_n...
  • delphiwcdj
  • delphiwcdj
  • 2012年01月05日 21:10
  • 3076

windows下用c++获取本机ip地址

windows下用c++获取本机ip地址工作过程中遇到一个需求,需要获取本机ip地址,同时获取本机网络连接情况,即网线是否连接。经过多番搜索,有如下3种方案。1、管道+多进程思路:在一个cmd中执行i...
  • junbujianwpl
  • junbujianwpl
  • 2017年11月09日 23:03
  • 225

C/C++ windows获取本机ip地址

#define DEFAULT_IP "127.0.0.1" #define MAX_PATH 260 // 获得本机的IP地址 CString GetLocalIP() { // 获得本机主机名...
  • pingD
  • pingD
  • 2015年02月09日 21:14
  • 6162

C++获得本机IP地址

//获得本地主机名和IP地址      WORD wVersionRequested;      WSADATA wsaData;      char name[255];      CString ...
  • dreamlins
  • dreamlins
  • 2008年01月15日 16:19
  • 3046

windows下用c++获取本机ip地址

windows下用c++获取本机ip地址工作过程中遇到一个需求,需要获取本机ip地址,同时获取本机网络连接情况,即网线是否连接。经过多番搜索,有如下3种方案。1、管道+多进程思路:在一个cmd中执行i...
  • junbujianwpl
  • junbujianwpl
  • 2017年11月09日 23:03
  • 225
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用C++编程获得某台机器的IP地址?
举报原因:
原因补充:

(最多只允许输入30个字)