转自: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结构感到陌生。
分享到:
相关推荐
在IT领域,获取某台机器的IP地址是常见的任务,特别是在网络编程中。本文将深入探讨如何使用C++编程语言来实现这一功能。C++本身并不直接提供获取IP地址的库,但我们可以借助第三方库或者操作系统提供的接口来完成。...
在C++编程中,获取某台机器的IP地址通常涉及到使用Windows Socket API,简称Winsock。这个API提供了标准的套接字接口,使得开发者能够进行网络通信。在本例中,我们将探讨如何编写一个简单的C++程序来显示本地计算机...
标题明确了文章的主题是介绍如何使用C++编程语言获取本机连接到互联网时所使用的IP地址(即外网IP地址)。这通常用于需要了解客户端真实IP地址的服务端应用程序开发中。 #### 描述解释:获得外网IP的小函数 描述...
标题中的“vc局域网的IP地址扫描器”指的是使用Visual C++编程语言开发的一款工具,它能够探测并显示局域网(LAN)中的所有设备的名称、IP地址以及MAC地址。这款应用的核心功能是IP扫描,通过发送网络数据包并分析...
本示例项目"**C++ Scoket实现Client获取本机计算机名和ip地址发送到Server**"旨在教授如何利用C++进行Socket编程,以便客户端(Client)能够获取本地计算机的名称和IP地址,并将这些信息发送给服务器(Server)。...
总的来说,C++中进行域名到IP地址的转换涉及了对标准库和网络编程的理解,以及错误处理和资源管理的知识。通过选择合适的方法和工具,我们可以高效地完成这一任务,尤其在处理多IP地址的情况下。
标题中的“一个可以利用Windows API获得机器IP地址的程序”是指一个小型的Windows应用程序,它通过调用操作系统提供的API函数来获取本地计算机的IP地址。Windows API是Windows操作系统提供的一系列函数接口,开发者...
在C++领域,网络编程是实现跨机器通信的关键技术,广泛应用于服务器开发、客户端应用以及分布式系统中。本实例——"C++网络编程实例——网络编程DEMO",旨在通过Visual Studio 2005(VC++)环境,提供一个实践性的...
总结起来,这个C++基于TCP/IP的客户端、服务器通信实例展示了如何利用C++的网络编程能力实现两台机器之间的数据交换。通过学习这个实例,开发者可以深入理解TCP/IP协议的工作原理,以及如何在实际项目中应用这些知识...
在描述中提到,“VC++实现根据IP地址查询机器所在地区”,这表明开发者使用了微软的Visual C++开发环境和C++编程语言来编写代码。VC++是一个强大的Windows平台上的集成开发环境,适合创建桌面应用程序。由于IP定位...
在IT领域,获取本地计算机的IP地址和机器名是常见的操作,这有助于网络通信和系统管理。本篇文章将深入探讨如何获取这些信息,并提供相关的编程方法。 首先,我们需要理解什么是本地IP地址。本地IP地址是分配给...
在IT领域,尤其是在网络管理与编程中,"局域网IP地址筛选源程序及说明"是一个重要的主题。这个标题指的是一个特别设计的软件工具,它能够自动扫描并筛选出局域网(LAN)内的有效IP地址。这个工具对于网络管理员来说...
- **回环地址**:`127.0.0.1`是一个特殊的IP地址,称为回环地址,用于在同一台机器上测试网络编程代码。 - **示例代码**:下面是一个简单的基于TCP的服务器端C++代码示例: ```cpp #include #include int main...
获取外网IP地址通常依赖于第三方服务,因为直接从本地机器获取的是内网IP地址,而外网IP地址是由ISP(互联网服务提供商)分配的,用于在网络间识别设备。以下是一种通过读取特定网站返回的IP地址信息来获取外网IP的...
Socket是网络通信中的一个端点,可以看作是两台机器之间建立连接并交换数据的通道。在C++中,我们可以使用标准库`<sys/socket.h>`和`<netinet/in.h>`来创建和操作Socket。 1. **创建Socket**: 在C++中,创建...
2. **配置Socket**:配置Socket涉及地址结构体(如`sockaddr_in`)的填充,包含IP地址和端口号。对于服务器,通常需要绑定Socket到特定的IP和端口上,使用`bind()`函数;客户端则不需要绑定,但在连接服务器时需指定...
总结起来,获取PB9.0的本地IP地址涉及对网络编程的理解,包括网络接口、IP地址类型以及如何通过不同的编程手段实现这一功能。无论是通过DLL、Winsock还是.NET,都需要对这些底层机制有深入的认识。在实际项目中,...
首先,淘宝IP地址库是一个广泛使用的资源,它提供了一个庞大的IP地址到地理位置的映射,帮助开发者快速定位用户的位置。这个库通常以JSON格式存储,因为JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也...
本文将详细解析如何通过VC++编程语言获取指定IP地址的MAC地址,基于提供的压缩包文件中的源代码进行分析。 首先,我们要理解MAC地址的基本概念。MAC地址是物理地址,通常在局域网(LAN)中用于识别网络接口控制器...
IP地址是网络上设备的唯一标识,如192.168.1.1,而计算机名是用户为机器设定的名称,如MyComputer。在Windows系统中,我们可以使用`socket`库或者`ipconfig`命令来获取或转化IP和计算机名。在Linux中,可以使用`...