实验六 获取网卡的MAC地址.doc_第1页
实验六 获取网卡的MAC地址.doc_第2页
实验六 获取网卡的MAC地址.doc_第3页
实验六 获取网卡的MAC地址.doc_第4页
实验六 获取网卡的MAC地址.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验六、获取网卡的MAC地址实验目的及要求 掌握获取网卡MAC地址的编程原理,学会使用Visual C+ 6.0与NETBIOS编写W32 Console Application;实验属性 设计实验步骤 1. 阅读本实验后附录的背景材料,熟悉获取网卡MAC地址的编程原理,参考本报告中提供的部分实现代码改编一个VC程序以获取网卡MAC地址;2. 使用 Visual C+ 6.0, 输入、编辑、编译、运行与调试获取网卡MAC地址的程序;3在命令提示符中键入Windows NT/2000/XP 的“ipconfig /all”命令或Windows 98的“winipcfg”命令并执行,根据命令显示的网卡信息与自己程序执行结果比较,检测实验结果是否正确。实验内容1写出程序的源代码如下,并对主要语句作注释:2运行、测试该程序,记录测试结果,分析遇到的问题与解决的办法。 实验步骤 / GetMacAddr.cpp : Defines the entry point for the console application.#include stdafx.h#include GetMacAddr.h#include #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ The one and only application objectCWinApp theApp;using namespace std;typedef structADAPTER_STATUS adapt;NAME_BUFFER NameBuff30; ASTAT;void GetMacAddress(CString sNetBiosName) ASTAT Adapter;int i; NCB ncb; UCHAR uRetCode; memset(&ncb, 0, sizeof(ncb); ncb.ncb_command = NCBRESET; ncb.ncb_lana_num = 0; uRetCode = Netbios(&ncb); memset(&ncb, 0, sizeof(ncb); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = 0; FillMemory(ncb.ncb_callname, NCBNAMSZ - 1, 0x20);strcpy(char *)ncb.ncb_callname, (LPCTSTR) sNetBiosName);ncb.ncb_callnamesNetBiosName.GetLength() = 0x20; ncb.ncb_callnameNCBNAMSZ = 0x0; ncb.ncb_buffer = (unsigned char *) &Adapter; ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios(&ncb); if (uRetCode = 0) for(i=0; i5; i+)printf(%02X-, Adapter.adapt.adapter_addressi); printf(%02X, Adapter.adapt.adapter_address5); int _tmain(int argc, TCHAR* argv, TCHAR* envp)int nRetCode = 0; / initialize MFC and print and error on failureif (!AfxWinInit(:GetModuleHandle(NULL), NULL, :GetCommandLine(), 0)/ TODO: change error code to suit your needscerr _T(Fatal Error: MFC initialization failed) endl;nRetCode = 1;else/ TODO: code your applications behavior here. GetMacAddress(*);return nRetCode;实验报告 1简要写出获取网卡MAC地址的编程原理及解题思路。2写出能上机运行的具体算法。3总结使用Visual C+ 6.0与NETBIOS编写W32 Console Application的思路。编程背景材料:众所周知,一个网卡对应唯一MAC地址,对一些应用程序来说,获取网卡MAC地址有时是必要的,使用VC提供的netbios网络编程接口可以方便获取网卡MAC地址。netbios中所用的函数声明、常数等等均是在头文件nb30.h内定义的,若想使用netbios,须连接的库是netapi32.lib。调用netbios函数时,使用uRetCode = netbios(&ncb)语句,其入口参数&ncb为指向一网络控制块(NCB)的指针。在该NCB结构中,包含了为执行一个netbios命令相应需预先准备(在调用前)或命令执行结果(在调用后)的全部信息,在调用netbios函数前要先预置好该NCB结构中的一些有关字段;返回码uRetCode正常时应为0,返回的具体结果会包含在NCB结构的一些字段中。NCB结构的定义如下:typedef struct _NCBUCHAR ncb_command; /用于指定要执行的NetBIOS命令, 一些常见的NetBIOS命令如附表所示UCHAR ncb_retcode; /用于指定操作的返回代码,若返回值为0,就表示操作成功UCHAR ncb_lsn; /对应一个本地会话编号,成功的执行了一次NCBCALL或NCBLISTEN命令后,/函数会返回一个会话编号UCHAR ncb_num; /用于知道本地名字的编号,伴随NCBADDNAME或NCBADDGRNAME命令的/每一次调用,都会返回一个新的编号PUCHAR ncb_buffer; /指向数据缓冲区,发送时该缓冲区包含了要送出去的实际数据,接收时的接收/数据则为从NetBIOS函数返回的数据;对其他命令来说,如NCBENUM,缓冲区/便是预定义的结构LANA_ENUMWORD ncb_length; /指定缓冲区的长度,以字节数为单位,接收时NetBios会将该值设为收到的字节/数,若指定的缓冲区不够大,NetBIOS就会返回NRC_BUFLEND错误UCHAR ncb_callnameNCBNAMSZ; /用于指定远程应用的名字UCHAR ncb_nameNCBNAMSZ; /用于指定应用程序已知的名字UCHAR ncb_rto; /规定接收操作时的会话超时(以0.5秒为单位)UCHAR ncb_sto; /规定发送操作时的会话超时(以0.5秒为单位)viod (CALLBACK *ncb_post) (struct _NCB *); /异步命令完成后,调用的后处理程序地址UCHAR ncb_lana_num; /指定LAN Adapter编号UCHAR ncb_cmd_cplt; /用于指定操作的返回代码,异步操作进行期间,Netbios会将这个值设为/NRC_PENDINGUCHAR ncb_reserve10; /保留,必须为0HANDLE ncb_event; /事件对象的句柄,netbios函数返回非0值时会发信号给事件NCB, *PNCB;nb30.h中还定义了另外一个很重要的结构LANA_ENUM,当主机中有两块以上网卡时,使用NCB命令NCBENUM后(该命令只能在Windows NT/2000/XP中使用),该结构中会含有返回的网卡数目及其索引,该结构的定义如下:typedef struct LANA_ENUM UCHAR length; UCHAR lana MAX_LANA; LANA_ENUM, *PLANA_ENUM;其中: lana MAX_LANA定义了一个存放所有网卡信息的数组,length表示该数组的长度,即为本机所带网卡的个数。此外,我们还要定义一个描述网卡的结构ASTAT,其中使用了结构ADAPTER_STATUS(也由nb30.h定义):typedef structADAPTER_STATUS adapt;NAME_BUFFER NameBuff30; ASTAT;其中的ADAPTER_STATUS结构为typedef struct _ADAPTER_STATUS UCHAR adapter_address6; /网卡MAC地址 UCHAR rev_major; UCHAR reserved0; UCHAR adapter_type; UCHAR rev_minor; WORD duration; WORD frmr_recv; WORD frmr_xmit; WORD iframe_recv_err; WORD xmit_aborts; DWORD xmit_success; DWORD recv_success; WORD iframe_xmit_err; WORD recv_buff_unavail; WORD t1_timeouts; WORD ti_timeouts; DWORD reserved1; WORD free_ncbs; WORD max_cfg_ncbs; WORD max_ncbs; WORD xmit_buf_unavail; WORD max_dgram_size; WORD pending_sess; WORD max_cfg_sess; WORD max_sess; WORD max_sess_pkt_size; WORD name_count; ADAPTER_STATUS, *PADAPTER_STATUS;在调用netbios NCBASTAT命令前,我们可将指向ADAPTER_STATUS结构的指针值赋给缓冲区指针ncb.ncb_buffer,ASTAT Adapter;ncb.ncb_buffer = (unsigned char *) &Adapter; /两个指针指向同一个地方 ncb.ncb_length = sizeof(Adapter); / 设置ncb_buffer缓冲区长度这样在执行NCBASTAT命令后,由于ncb.ncb_buffer指针所指的缓冲区中为命令执行后网卡返回的统计结果(其中包含MAC网卡地址),我们使用与其同一地址的ADAPTER_STATUS结构的adapter_address6字段便可取出网卡地址。几点说明:1 由于ncb_command字段用于指定要执行的netbios命令,所以总是在执行一个netbios命令之前设置该ncb_command字段。例如:(1)我们要获取当前计算机有多少个网卡,则可用以下一段代码来实现:NCB ncb; /网络控制块 LANA_ENUM lana_enum; /该结构包含网卡数目及其索引memset(&ncb, 0, sizeof(ncb) ); /NCB结构清零ncb.ncb_command = NCBENUM; UCHAR uRetCode = Netbios(&ncb); int num; /标识网卡个数num = lana_enum.length;(2)对网卡进行初始化可用以下代码实现:memset(&ncb, 0, sizeof(ncb);ncb.ncb_command = NCBRESET;ncb.ncb_lana_num = 0;uRetCode = Netbios(&ncb );(3)查询网卡包括MAC地址等在内的信息可用以下代码实现: memset(&ncb, 0, sizeof(ncb); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = 0; sNetBiosName *; FillMemory(ncb.ncb_callname, NCBNAMSZ -

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论