| 订阅 | 在线投稿
分享
 
 
当前位置: 王朝网络 >> c/c++ >> 如何用C++编程获得某台机器的IP地址
 

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

2008-06-01 02:04:46 编辑來源:互联网 繁體版 评论
 
 
  编译:Northtibet下载源代码(zip压缩文件, 1K)

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

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

  }

  

如何用C++编程获得某台机器的IP地址
更多内容请看C/C++技术专题 IP地址知识普及专题 java编程开发手册专题,或

  要使用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 结构在内存中存放示意图:
如何用C++编程获得某台机器的IP地址
图二 hostent 结构在内存中的存放示意图 相信以上的解释再辅以阅读代码,你以后不再会对hostent结构感到生疏。

  

   最后,顺祝编程愉快!
如何用C++编程获得某台机器的IP地址
更多内容请看C/C++技术专题 IP地址知识普及专题 Java编程开发手册专题,或
 
 
 
 
上一篇《C++的iostream标准库介绍(1)》
下一篇《入门教程:C++中的const限定修饰符》
 
 
 
 
 
 
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

如何磨出破洞牛仔裤?牛仔裤怎么剪破洞?

把牛仔裤磨出有线的破洞 1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...

我就是扫描下图得到了敬业福和爱国福

先来看下敬业福和爱国福 今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。 今天该活动正式启动,和去年一样,需要收集“五福”...

冰箱异味产生的原因和臭味去除的方法

有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。 1、很多人有这种习...

 
 
 
  编译:Northtibet  下载源代码(zip压缩文件, 1K)   对于这个古老的问题,VC知识库的精华区以及以往的在线杂志中都有详尽不一的描述。本文提供的方法是一个比较完整的解决方案,并附有具体的实现细节。希望大家对这个问题有彻底的熟悉。其实,假如你熟悉 Windows 的Sockets API,并了解一些底层的Winsock知识。那么要获得某台机器的IP地址并不是什么难事。一台机器可以装多块网卡,因此它就可能有多个IP地址。目前很多发烧友的PC机都装有多块网卡。其中一块网卡与调制解调器(MODEM)或者ADSL适配器相连,另一块与家里的局域网(LAN)相连。对于有宽带连接条件的家庭,这更是一种典型的配置。任何事情,一旦你知道了解决的方法,一切都会变得如此简单。下面是本文提供的一个简单的控制台程序(程序名为getip1),其功能就是显示本机的IP地址。如图一所示: [url=http://www.wangchao.net.cn/bbsdetail_1785320.html][img]http://image.wangchao.net.cn/it/1323423899378.gif[/img][/url] 图一 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; } [url=http://www.wangchao.net.cn/bbsdetail_1785320.html][img]http://image.wangchao.net.cn/it/1323423899426.gif[/img][/url] 更多内容请看C/C++技术专题 IP地址知识普及专题 java编程开发手册专题,或   要使用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 结构在内存中存放示意图: [url=http://www.wangchao.net.cn/bbsdetail_1785320.html][img]http://image.wangchao.net.cn/it/1323423899453.gif[/img][/url] 图二 hostent 结构在内存中的存放示意图   相信以上的解释再辅以阅读代码,你以后不再会对hostent结构感到生疏。   最后,顺祝编程愉快! [url=http://www.wangchao.net.cn/bbsdetail_1785320.html][img]http://image.wangchao.net.cn/it/1323423899500.gif[/img][/url] 更多内容请看C/C++技术专题 IP地址知识普及专题 Java编程开发手册专题,或
󰈣󰈤
 
 
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
玉美人_珠联璧合
清纯美女米卡
清新靓丽的早晨
玲子的自信与性感
痞子的甘南日记
疑是银河落九天
雪域坝上四——纯美色
冬日恋歌——西城杨柳弄轻柔
 
>>返回首页<<
 
 
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 热帖排行
 
 
 
 
©2005- 王朝网络 版权所有