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

2016-02-19 20:22 0 1 收藏

今天图老师小编给大家精心推荐个如何用C++编程获得某台机器的IP地址教程,一起来看看过程究竟如何进行吧!喜欢还请点个赞哦~

【 tulaoshi.com - 编程语言 】

编译:Northtibet  下载源代码(zip压缩文件, 1K) !-- frame contents -- !-- /frame contents --   对于这个古老的问题,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", WSAGetLastError());
        return -1;
     }
  
     //////////////////
     // 获得主机名.
     //
     char hostname[256];
     int res = gethostname(hostname, sizeof(hostname));
     if (res != 0) {
        printf("Error: %u", WSAGetLastError());
        return -1;
     }
     printf("hostname=%s", hostname);
     ////////////////
     // 根据主机名获取主机信息.
     //
     hostent* pHostent = gethostbyname(hostname);
     if (pHostent==NULL) {
        printf("Error: %u", WSAGetLastError());
        return -1;
     }
     //////////////////
     // 解析返回的hostent信息.
     //
     hostent& he = *pHostent;
     printf("name=%saliases=%saddrtype=%dlength=%d",
  
         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", inet_ntoa(sa.sin_addr)); // 显示地址串
     }
     //////////////////
     // 终止 Windows sockets API
     //
     WSACleanup();
     return 0;
  } 更多内容请看C/C++技术专题  IP地址知识普及专题  Java编程开发手册专题,或   要使用Winsock,首先必须调用WSAStartup,最后结束时不要忘了调用WSACleanup。要获取IP地址,首先必须得到机器的主机名(host name),调用gethostname就可以实现,有了主机名,接下来调用gethostbyname来获取包括IP地址在内的更多的主机信息。 !-- frame contents -- !-- /frame contents -- 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结构感到生疏。
     最后,顺祝编程愉快! 更多内容请看C/C++技术专题  IP地址知识普及专题  Java编程开发手册专题,或

来源:https://www.tulaoshi.com/n/20160219/1623473.html

延伸阅读
先看下面的程序: 代码如下: void main() {     int a = 100;     int *ap = &a;     printf("%p\n",&a);//输出:002AF744     printf("%p\n",ap);//输出:002AF744     printf("%d\n",*ap);//输出:100     printf("%p\n",&ap);//输出...
1. 如何获取应用程序的实例句柄? 应用程序的 实例句柄保存在CWinAppIm_hInstance 中,可以这么调用AfxGetInstancdHandle获得句柄. Example: HANDLE hInstance=AfxGetInstanceHandle();  2. 如何通过代码获得应用程序主窗口的指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用 AfxGetMainWnd实现。 AfxG...
C/C++语言中有许多对初学者(甚至是有经验的编程人员)来说很轻易范的错误。通晓这样的错误可使你免于陷入其中。 忘记初始化指针 !-- frame contents -- !-- /frame contents -- 这种错误只是一般"忘记初始化变量"错误的一个非凡形式(C/C++中变量不会自动初始化,而Basic可以)。使这种错误更糟糕的原因是它的后果往往更加糟...
第7章 内存治理 欢迎进入内存这片雷区。伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存治理程序,往往提心吊胆。假如不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本章的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地...
前文回顾:C/C++编程新手错误语录  错误语录(续一) (13)“整型变量仅仅意味着一个整数” !-- frame contents -- !-- /frame contents -- 当我们还是一个新手,看整型就是整数; 当我们成为高手,看什么都是整型。 整型,在所有C/C++基本数据类型中最富有艺术魅力和奇幻色彩。 我们从某闻名...

经验教程

295

收藏

21
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部