获取MAC地址和IP地址的程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
获取MAC地址和IP地址的程序设计
通信0402班学号:0905040225 姓名:张玉海指导老师: 王国才
【设计目标】
通过设计程序能获取本计算机的MAC地址和IP地址并显示。
【设计原理和方法】
本程序设计包含两个部分:一、获取本机IP地址;二、获取本机MAC地址。我是通过VB编程实现的。
其中,为了获取本机的IP地址,要使用WinSock库,WinSock API是Microsoft Windows 的网络程序接口。应用程序在使用WinSock API之前,必须调用WSAstartup函数,只有调用函数成功返回(表示应用程序与WinSock库成功的简历其连接),应用程序才可以调用其他Windows Socketers .DLL中的函数。当程序将要结束时,又必须调用WSACleanup函数可以结束Windows Socketers .DLL的使用。WinSock规范定义了几个数据库的例程。其中我们要用到gethostname和gethostbyname两个函数来得到IP地址。gethostname可以获得主机名, gethostbyname函数能够从主机名得到对应的“主机”(由名字和地址标识),函数唯一的参数name就是前面调用gethostname函数得到的主机名,二返回值是一个hostent结构,他可以标识一个“主机”列表,hostent的最后一个分量hAddrList中,就可以得到与主机名对应的一个或多个IP地址,hAddrList是一个列表,通过它就可以得到所有的IP地址。
MAC地址也叫物理地址、硬件地址或链路地址,此程序设计的获取MAC地址是通过NetBIOS编程实现的。其中,要用到网络编程接口中的一个重要的概念,那就是LANA编号(LAN适配器编号,LANadaprer),每张物理网卡都会分配一个独一无二的LANA编号。要想调用NetBIOS API函数,需要链接系统的NETAPI.DLL文件NetBIOS API包含的内容其实分全场简单,因为实际上NetBIOS API只是一个函数NetBios ,在Visual Basic中可以这样引入:
Private Declare Function Netbios Lib "netapi32.dll" (pncb As NET_CONTROL_BLOCK) As Byte
函数中唯一的参数pncb是一个指向某个网络控制块(NET_CONTROL_BLOCK)的指针,在那个NET_CONTROL_BLOCK结构中,包含了为执行一个NetBIOS命令,相应的NetBios函数需要用的的前部信息。NetBIOS提供了几个命令专门负责收集网络参数的命令,其中包括名字查找命令和适配器状态命令,利用适配器状态命令可以获得本地计算机及其LANA编号的有关信息,这就是查知其的MAC地址的一条可行路径。其中在网络适配器状态命令的ADAPTER_STA TUS结构中我们最为关心的就是adapter_address字段,它标识的就是网卡的MAC地址。
【设计的功能】
用Visual Basic进行网络编程,通过使用WinSock API和NetBIOS API分别获取IP 和MAC地址,并能够显示出来。
【程序框图】
程序流程图分为两部分,获取MAC地址的部分和获取IP地址的部分。
获取MAC地址的主程序流程图如下:
获取IP地址的主程序流程图如下:
【设计思想及主要函数介绍】
此程序的运行也分为两大块,获取IP部分和获取MAC部分。
一、获取IP部分:
这部分需要调用Windows Sockets应用程序,在使用之前要对 Windows Sockets.dll 中的一些函数声明。下面是需要用到的一些函数:
连接Winsock库:int WSAstartup(WORD wversionrequested; LPWSDATA lpwsadata; )应用程序在调用Winsock API之前,必须调用该函数,只有该函数成功返回才可以调用其他Windows Sockets.dll中的函数
断开Winsock库:int WSAcleanup(void)
Sockets初始化函数:SocketsInitialize(),该函数就是对Windows Sockets初始化的函数,如果初始化成功,则返回值:Ture;若不成功,则返回值:Flase。具体函数原型见程序源代码。
Gethostname函数可以得到本地主机名,其函数原型如下:
Int gethostname(char name; int namelen)
Name参数用来接收本地主机名的缓冲区地址;namelen参数用来接收缓冲区的大小。
Gethostbyname函数能够从主机名得到对应的“主机”,其函数原型如下:
Struct hostent Gethostbyname( char name)
函数唯一name就是前面调用gethostname函数得到的主机名,而返回制是一个hostent 结构,它可以标识一个“主机列表”,hostent结构定义如下:
Private Type HOSTENT
hName As Long
hAliases As Long
hAddrType As Integer
hLen As Integer
hAddrList As Long
从其中的最后一个分量hAddrList中,就可以得到与主机名对应的一个或多个IP地址。hAddrList是一个列表,通过它就可以得到所有的IP地址。
在调用Winsock中的函数时应注意一些事项,如gethostbyname()指向区域是由Windows Sockets函数库分配的,这些指针指向的数据是容易丢失的。它们只有在该线程下一个Windows Sockets API调用前有效,此外,应用程序不应该试图修改这个结构,或者释放其中的任何一部分。
主函数GetIPAddress()获得IP地址的方法稍微复杂一点,它的核心思想是先获取主机名,然后在主机名的基础上调用Gethostbyname获得描述主机的结构信息并从中解析出主机的IP地址。
二、获取MAC地址部分
这部分需要调用NetBIOS API函数,需要链接系统的NETAPI.DLL文件NetBIOS API 包含的内容其实分全场简单,因为实际上NetBIOS API只是一个函数NetBios ,在Visual