`
mywebcode
  • 浏览: 1037814 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

转自:http://www.vckbase.com/document/viewdoc/?id=435




下面是程序的代码,很简单:

////////////////////////////////////////////////////////////////
//
// 本程序报告本机上每一块网卡的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结构感到陌生。

分享到:
评论

相关推荐

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

    在IT领域,获取某台机器的IP地址是常见的任务,特别是在网络编程中。本文将深入探讨如何使用C++编程语言来实现这一功能。C++本身并不直接提供获取IP地址的库,但我们可以借助第三方库或者操作系统提供的接口来完成。...

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

    在C++编程中,获取某台机器的IP地址通常涉及到使用Windows Socket API,简称Winsock。这个API提供了标准的套接字接口,使得开发者能够进行网络通信。在本例中,我们将探讨如何编写一个简单的C++程序来显示本地计算机...

    C++获得本机外网ip

    标题明确了文章的主题是介绍如何使用C++编程语言获取本机连接到互联网时所使用的IP地址(即外网IP地址)。这通常用于需要了解客户端真实IP地址的服务端应用程序开发中。 #### 描述解释:获得外网IP的小函数 描述...

    vc局域网的IP地址扫描器,可扫描到局域网的所有机器的名称,IP地址及MAC地址

    标题中的“vc局域网的IP地址扫描器”指的是使用Visual C++编程语言开发的一款工具,它能够探测并显示局域网(LAN)中的所有设备的名称、IP地址以及MAC地址。这款应用的核心功能是IP扫描,通过发送网络数据包并分析...

    C++ Scoket实现Client获取本机计算机名和ip地址发送到Server

    本示例项目"**C++ Scoket实现Client获取本机计算机名和ip地址发送到Server**"旨在教授如何利用C++进行Socket编程,以便客户端(Client)能够获取本地计算机的名称和IP地址,并将这些信息发送给服务器(Server)。...

    c++ 域名转ip

    总的来说,C++中进行域名到IP地址的转换涉及了对标准库和网络编程的理解,以及错误处理和资源管理的知识。通过选择合适的方法和工具,我们可以高效地完成这一任务,尤其在处理多IP地址的情况下。

    一个可以利用Windows API获得机器IP地址的程序(3KB)

    标题中的“一个可以利用Windows API获得机器IP地址的程序”是指一个小型的Windows应用程序,它通过调用操作系统提供的API函数来获取本地计算机的IP地址。Windows API是Windows操作系统提供的一系列函数接口,开发者...

    C++网络编程实例------网络编程DEMO,

    在C++领域,网络编程是实现跨机器通信的关键技术,广泛应用于服务器开发、客户端应用以及分布式系统中。本实例——"C++网络编程实例——网络编程DEMO",旨在通过Visual Studio 2005(VC++)环境,提供一个实践性的...

    C++基于TCP/IP客户端、服务器通信实例

    总结起来,这个C++基于TCP/IP的客户端、服务器通信实例展示了如何利用C++的网络编程能力实现两台机器之间的数据交换。通过学习这个实例,开发者可以深入理解TCP/IP协议的工作原理,以及如何在实际项目中应用这些知识...

    ip2Area根据IP地址查询机器所在地区

    在描述中提到,“VC++实现根据IP地址查询机器所在地区”,这表明开发者使用了微软的Visual C++开发环境和C++编程语言来编写代码。VC++是一个强大的Windows平台上的集成开发环境,适合创建桌面应用程序。由于IP定位...

    取得本地IP地址与机器名

    在IT领域,获取本地计算机的IP地址和机器名是常见的操作,这有助于网络通信和系统管理。本篇文章将深入探讨如何获取这些信息,并提供相关的编程方法。 首先,我们需要理解什么是本地IP地址。本地IP地址是分配给...

    局域网IP地址筛选源程序及说明

    在IT领域,尤其是在网络管理与编程中,"局域网IP地址筛选源程序及说明"是一个重要的主题。这个标题指的是一个特别设计的软件工具,它能够自动扫描并筛选出局域网(LAN)内的有效IP地址。这个工具对于网络管理员来说...

    学习网络编程C++网络编程学习

    - **回环地址**:`127.0.0.1`是一个特殊的IP地址,称为回环地址,用于在同一台机器上测试网络编程代码。 - **示例代码**:下面是一个简单的基于TCP的服务器端C++代码示例: ```cpp #include #include int main...

    获取本机当前外网IP地址和主机名

    获取外网IP地址通常依赖于第三方服务,因为直接从本地机器获取的是内网IP地址,而外网IP地址是由ISP(互联网服务提供商)分配的,用于在网络间识别设备。以下是一种通过读取特定网站返回的IP地址信息来获取外网IP的...

    socket编程-c++

    Socket是网络通信中的一个端点,可以看作是两台机器之间建立连接并交换数据的通道。在C++中,我们可以使用标准库`&lt;sys/socket.h&gt;`和`&lt;netinet/in.h&gt;`来创建和操作Socket。 1. **创建Socket**: 在C++中,创建...

    C++ Socket 网络编程

    2. **配置Socket**:配置Socket涉及地址结构体(如`sockaddr_in`)的填充,包含IP地址和端口号。对于服务器,通常需要绑定Socket到特定的IP和端口上,使用`bind()`函数;客户端则不需要绑定,但在连接服务器时需指定...

    PB9.0 获取本地ip地址

    总结起来,获取PB9.0的本地IP地址涉及对网络编程的理解,包括网络接口、IP地址类型以及如何通过不同的编程手段实现这一功能。无论是通过DLL、Winsock还是.NET,都需要对这些底层机制有深入的认识。在实际项目中,...

    vs2005下通过淘宝IP地址库获取IP的地区信息

    首先,淘宝IP地址库是一个广泛使用的资源,它提供了一个庞大的IP地址到地理位置的映射,帮助开发者快速定位用户的位置。这个库通常以JSON格式存储,因为JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也...

    vc源代码 得到指定IP机器的MAC地址.zip

    本文将详细解析如何通过VC++编程语言获取指定IP地址的MAC地址,基于提供的压缩包文件中的源代码进行分析。 首先,我们要理解MAC地址的基本概念。MAC地址是物理地址,通常在局域网(LAN)中用于识别网络接口控制器...

    多线程处理+IP地址和计算机名相互转化(源码)

    IP地址是网络上设备的唯一标识,如192.168.1.1,而计算机名是用户为机器设定的名称,如MyComputer。在Windows系统中,我们可以使用`socket`库或者`ipconfig`命令来获取或转化IP和计算机名。在Linux中,可以使用`...

Global site tag (gtag.js) - Google Analytics