`
xiaguangme
  • 浏览: 74229 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

获取IP地址和MAC地址程序(转)

阅读更多

http://hi.baidu.com/bestrongest/blog/item/5a891c2c874a00e88a139991.html

 

获取IP地址和MAC地址程序(转)
2008-03-01 20:08

#include <winsock2.h> //该头文件定义了Socket编程的功能
#include <stdio.h>    //该头文件声明了输入输出流函数
#include <stdlib.h>   //该头文件定义了一些通用函数
#include <httpext.h>   //该头文件支持HTTP请求
#include <windef.h>   //该头文件定义了Windows的所有数据基本型态
#include <Nb30.h>   //该头文件声明了netbios的所有的函数

#pragma comment(lib,"ws2_32.lib")    //连接ws2_32.lib库.只要程序中用到Winsock API 函数,都要用到 Ws2_32.lib
#pragma comment(lib,"netapi32.lib")   //连接Netapi32.lib库,MAC获取中用到了NetApi32.DLL的功能

//在Win32平台上的Winsock编程都要经过下列的基本步骤:定义变量->获得Winsock版本->加载Winsock库->
//初始化->创建套接字->设置套接字选项->关闭套接字->卸载Winsock库,释放所有资源。
void CheckIP(void)    //定义checkIP函数,用于取本机的ip地址
{
WSADATA wsaData;
char name[155];      //定义用于存放获得主机名的变量
char *ip;            //定义IP地址变量
PHOSTENT hostinfo;
//调用MAKEWORD()获得Winsocl版本的正确值,用于下面的加载Winscok库
if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 )
{   //加载Winsock库,如果WSAStartup()函数返回值为0,说明加载成功,程序可以继续往下执行
if( gethostname ( name, sizeof(name)) == 0)
{ //如果成功,将本地主机名存放入由name参数指定的缓冲区中
   if((hostinfo = gethostbyname(name)) != NULL)
   { //这是获取主机,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo为PHOSTENT型的变量。
    ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
//inet_addr()函数把地址串转换为IP地址
//调用inet_ntoa()函数,将hostinfo结构变量中的h_addr_list转化为标准的IP地址(如202.197.11.12.)
    printf(" IP地址: %s\n",ip);        //输出IP地址
   }
}
WSACleanup( );         //卸载Winsock库,并释放所有资源
}
}

//通过WindowsNT/Win2000中内置的NetApi32.DLL的功能来实现的。首先通过发送NCBENUM命令,获取网卡的
//数目和每张网卡的内部编号,然后对每个网卡标号发送NCBASTAT命令获取其MAC地址。
int getMAC(char * mac)     //用NetAPI来获取网卡MAC地址
{    
NCB ncb;     //定义一个NCB(网络控制块)类型的结构体变量ncb
typedef struct _ASTAT_     //自定义一个结构体_ASTAT_
{
ADAPTER_STATUS   adapt;
NAME_BUFFER   NameBuff   [30];    
}ASTAT, *PASTAT;
ASTAT Adapter;  

typedef struct _LANA_ENUM     //自定义一个结构体_ASTAT_
{
UCHAR length;
UCHAR lana[MAX_LANA];     //存放网卡MAC地址
}LANA_ENUM;    
LANA_ENUM lana_enum;   

//   取得网卡信息列表    
UCHAR uRetCode;    
memset(&ncb, 0, sizeof(ncb));     //将已开辟内存空间ncb 的值均设为值 0
memset(&lana_enum, 0, sizeof(lana_enum));     //清空一个结构类型的变量lana_enum,赋值为0
//对结构体变量ncb赋值
ncb.ncb_command = NCBENUM;     //统计系统中网卡的数量
ncb.ncb_buffer = (unsigned char *)&lana_enum; //ncb_buffer成员指向由LANA_ENUM结构填充的缓冲区
ncb.ncb_length = sizeof(LANA_ENUM);  
//向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡,每个网卡的编号(MAC地址)
uRetCode = Netbios(&ncb); //调用netbois(ncb)获取网卡序列号   
if(uRetCode != NRC_GOODRET)    
return uRetCode;    

//对每一个网卡,以其网卡编号为输入编号,获取其MAC地址  
for(int lana=0; lana<lana_enum.length; lana++)    
{
ncb.ncb_command = NCBRESET;   //对网卡发送NCBRESET命令,进行初始化
ncb.ncb_lana_num = lana_enum.lana[lana];
uRetCode = Netbios(&ncb);  
if(uRetCode == NRC_GOODRET)
break;
}
if(uRetCode != NRC_GOODRET)
return uRetCode;    
   
//   准备取得接口卡的状态块取得MAC地址
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBASTAT;    //对网卡发送NCBSTAT命令,获取网卡信息
ncb.ncb_lana_num = lana_enum.lana[0];     //指定网卡号
strcpy((char*)ncb.ncb_callname, "*");   //远程系统名赋值为*
ncb.ncb_buffer = (unsigned char *)&Adapter; //指定返回的信息存放的变量
ncb.ncb_length = sizeof(Adapter);
//接着发送NCBASTAT命令以获取网卡的信息
uRetCode = Netbios(&ncb);
//   取得网卡的信息,并且如果网卡正常工作的话,返回标准的冒号分隔格式。  
if(uRetCode != NRC_GOODRET)  
return uRetCode;  
//把网卡MAC地址格式转化为常用的16进制形式,输出到字符串mac中
sprintf(mac,"%02X-%02X-%02X-%02X-%02X-%02X",    
Adapter.adapt.adapter_address[0],    
Adapter.adapt.adapter_address[1],    
Adapter.adapt.adapter_address[2],    
Adapter.adapt.adapter_address[3],    
Adapter.adapt.adapter_address[4],    
Adapter.adapt.adapter_address[5]
);
return 0;  
}

int main(void)   //主函数,程序的入口  
{
CheckIP();       //调用CheckIP()函数获得,输出IP地址
char   mac[200];  
getMAC(mac);   //调用getMAC()函数获得,输出MAC地址
printf(" mac地址 : %s \n",mac);  
return 0;
}

分享到:
评论

相关推荐

    pb获取ip地址/mac地址

    标题中的"pb获取ip地址/mac地址"指的是在PowerBuilder(简称pb)环境下获取计算机的IP地址和MAC地址。PowerBuilder是一种流行的.NET和Java应用程序开发工具,尤其适合于创建数据库驱动的应用程序。在这个场景中,...

    获取IP地址和MAC地址程序

    获取IP地址和MAC地址程序,大家可以看看,如果是做这方面的

    获取IP地址与MAC地址对应关系实验报告1

    五、程序运行效果程序运行后,用户可以在界面上看到本地计算机的 IP 和 MAC 地址,也可以输入其他主机的 IP 地址并发起 ARP 请求。当请求发送后,程序会捕获到 ARP 响应报文,解析出目标主机的 MAC 地址并显示在界面...

    获取本地ip,mac地址

    结合这两个函数,我们可以编写一个小程序来同时获取本地的IP和MAC地址。这些功能在许多应用场景中都很有用,例如网络配置、设备识别、日志记录等。 请注意,获取到的IP地址可能有多个,因为现代操作系统可能会配置...

    获取本地IP地址的小程序

    通过学习和理解这个小程序,开发者不仅可以掌握如何在Java中获取IP地址,还能进一步探讨网络编程的基础,包括异常处理、网络接口遍历等技术。同时,这种开源和分享的精神也是IT社区的重要组成部分,促进大家共同进步...

    pb中获得本机IP地址\MAC地址信息纯代码方式

    首先,获取IP地址通常涉及使用网络编程API,如Windows API或socket编程。在PowerBuilder中,你可以创建一个动态链接库(DLL)来封装这些API调用,然后在PB应用程序中调用。例如,可以使用`gethostbyname()`或`get...

    C语言去获取Linux系统的IP地址和MAC地址的方法

    在Linux系统中,获取IP地址和MAC地址是一件棘手的事情,特别是在特殊场合下,我们可能需要更多的信息,如系统中有几块网卡,他们的MAC地址是多少,每块网卡分配了几个IP等等。这些信息往往需要通过ifconfig命令来...

    Powerbuilder 获取IP地址,MAC地址

    下面我们将详细介绍如何在PowerBuilder中实现获取IP地址和MAC地址的功能。 首先,`GetAdaptersInfo` 是Windows API中的一个函数,用于获取本地计算机网络适配器的详细信息,包括IP地址和MAC地址。在PowerBuilder中...

    Qt获取IP地址、MAC地址等网卡信息,区分本地网卡、无线网卡和虚拟网卡

    在Unix-like系统中,可以使用`getifaddrs()`函数来遍历所有网络接口,并通过`ifa_addr`字段获取IP地址。在Windows中,可以使用`GetAdaptersAddresses()`函数,同样通过遍历结果来获取IP地址。IP地址通常有IPv4和...

    获取IP地址,MAC地址

    本项目“获取IP地址,MAC地址”利用MFC和`netapi32.lib`库来实现获取网络适配器的IP和MAC信息。下面我们将详细探讨这个过程中的关键知识点。 首先,我们需要了解`netapi32.lib`库。这是一个Windows API库,提供了对...

    java编程实现获取服务器IP地址及MAC地址的方法

    在Java编程中,获取服务器的IP地址和MAC地址是常见的需求,特别是在网络通信和系统管理中。本篇文章将详细介绍如何使用Java实现这一功能,包括针对单网卡和多网卡环境的情况。 首先,获取服务器的IP地址通常涉及到`...

    C#获取局域网内所有计算机的IP地址和MAC地址

    C#实现获取局域网内所有计算机的IP地址和MAC地址的控制台应用程序源码 程序启动时首先获取本机的IP和MAC地址; 然后获取局域网内所有计算机的IP地址; 输入IP地址回车,获取该IP的MAC地址; 输入“STARTSCAN”回车...

    跨平台 获取本机IP/MAC地址,检测是否内网IP,字符串IP转换成Number地址

    本文将深入探讨如何在不同的操作系统上获取本机的IP和MAC地址,以及如何判断一个IP地址是否为内网IP,并将字符串形式的IP地址转换为数值表示。我们将主要关注以下几个知识点: 1. **跨平台获取本机IP地址**: 跨...

    JS获取客户端IP地址及MAC地址(转)

    因此,`getIpAndMac.js` 文件可能只实现了获取IP地址的部分,而没有获取MAC地址的功能。 在实际开发中,如果需要获取MAC地址,通常会依赖于客户端应用程序或者用户手动输入。在服务器端,通过特定的网络库或API,如...

    C++编程获取IP地址和MAC地址

    VC 下建立win32程序实现获取本机IP地址和MAC 地址

    获取本地MAC地址小程序

    总的来说,这个"获取本地MAC地址小程序"是一个结合了Windows API和VC++编程技术的小型实用工具,对于理解网络编程和设备识别有很好的学习价值。通过深入研究源代码,我们可以了解到如何利用C++和Windows API进行本地...

    MFC IP地址 网关 MAC地址获取

    在MFC中获取IP地址、网关和MAC地址涉及到网络编程和系统底层接口的使用,尤其是Winsock库。 1. **IP地址获取** 获取IP地址通常通过Winsock API中的`gethostbyname()`或`getaddrinfo()`函数来实现。`gethostbyname...

    Chrome获取MAC地址扩展程序

    "Chrome获取MAC地址扩展程序"是一个专门设计用于在Chrome环境中获取计算机物理地址(即MAC地址)的插件。MAC地址是网络设备如网卡的唯一标识符,通常用于局域网内的设备识别和通信。在描述中提到,这个扩展程序利用...

    ASP.NET 获取客户端IP和MAC地址的程序

    在现代网络环境中,获取客户端的IP地址和MAC地址是许多应用场景中的基本需求之一。例如,在网络安全监控、日志记录、地理位置追踪等方面都有着重要的应用价值。本文将详细介绍如何在ASP.NET环境下使用C#语言实现...

    获取局域网中所有的IP地址以及MAC地址

    在IT行业中,网络通信是至关重要的组成部分,而了解并能够获取局域网中的IP地址和MAC地址对于网络管理和故障排查尤为关键。本文将详细解析如何通过编程实现这一功能,主要涉及的知识点包括IP地址、MAC地址的概念,...

Global site tag (gtag.js) - Google Analytics