2024年6月15日发(作者:)
实习报告
指导老师:***
题目编号: 13
系部: 通信工程系
专业方向:网络
班级: 0431
学号:******
学生: 张豫江
一. 选题任务
1.题目
(13).读取本地和远程机器网卡的MAC地址。
2。分析说明
网卡的MAC地址就是网卡物理地址,网卡的MAC地址是厂商生产的网卡的
地址,每个网卡的地址是唯一的,MAC地址的作用是用来找到用来通信的计算机,
所以获取网卡的物理地址是十分重要。运行程序,单击“获取”按钮,即可获
取网卡的物理地址,单击“退出”按钮,即可退出程序。如下图所示。这是初
步列出测试数据以及测试目的。
二.实现过程
1.编程思路
使用NetBIOS网络程序接口来获取网卡物理地址。只用一个函数Netbios,
下面是这个函数在网络接口的使用:
Netbios是网络基本输入/输出系统的缩写。该函数是与协议无关的网络程
序接口。
2.函数声明:
Private Declare Function Netbios Lib "" (pncb As
NET_CONTROL_BLOCK) As Byte
3.参数:Pncb参数,指向某个网络控制块。
4.返回值:
若返回值为NRC-BADNCB,则网络控制块调用失败。否则,返回网络控制块
卡的接口地址。
5.具体实现步骤如下:
1)。新建一个标准工程,创建一个新窗体。
首先打开“Microsoft Visual Basic 6.0中文版”,见到图8-1:
图 8-1 VB“新建工程”对话框
选择“标准EXE”
工具箱
,再单击“打开”按钮,出现如下VB工作界面:
工程资源
管理器
图 8-2 VB工作界面
查看代码
查看对象
属性窗口
如果在图8-1中单击了“取消”按钮,那么图8-2中除主菜单以外,一片空
白。此时需要单击“文件”“新建工程”,打开“新建工程”对话框,选择“标
准EXE”,单击“打开”,才可见到图8-2。
对象窗口
图8-2是Windows中应用软件常见的工作窗口,只是它有许多特有的组成
部件,如图8-2中标识所示。现在单击VB标准工具栏上的“启动”按钮,
窗体布局
窗口
将看见图8-3:
图 8-3 正在运行的程序窗体
这就是最简单的,没有任何实际内容的VB应用程序——空窗体。
小知识:窗体文件
任何Windows应用程序都有运行窗口,窗口对应着开发阶段的窗体,保存
窗体相关信息的文件称为窗体文件。它的扩展名是.frm一个窗体内容保存在一
个窗体文件中。。每
2)。在窗体中放置一个Label控件,一个Text控件,两个Command控件。
在界面左上找到相应控件,拖入对象窗口。
方各个控件名称更改方法:鼠标右键点击控件,选择属性窗口,此时在编
程界面右下方的属性窗口里找到caption在它后边的窗口里更改。
3)。程序代码
双击左边Command控件进入编程窗口,输入程序代码如下:
‘以下是定义变量
Option Explicit
Const NCBASTAT As Long = &H33 '获得网卡的状态
Const NCBNAMSZ As Long = 16 '程序名称长度
Const HEAP_ZERO_MEMORY As Long = &H8 '指定分配内存区首先初始化为0
Const HEAP_GENERATE_EXCEPTIONS As Long = &H4 '当函数执行失败时,系统
将产生一个意外
Const NCBRESET As Long = &H32 '重新设置网卡,当执行网卡控制块中的任何
命令前必须重新设置网卡
Private Type NET_CONTROL_BLOCK
ncb_command As Byte '指定执行的命令代码
ncb_buffer As Long '指向信息缓冲去的指针
ncb_length As Integer '指向信息缓冲去的大小
ncb_callname As String * NCBNAMSZ '指定控制程序的名称
ncb_name As String * NCBNAMSZ '指定当前程序名称
ncb_lana_num As Byte '指定网卡数字编码
ncb_cmd_cplt As Byte '指定命令完成标志
End Type
Private Type ADAPTER_STATUS '网卡状态信息数据结构,由Netbios函数返回
标志
adapter_address(5) As Byte
adapter_type As Byte
End Type
Private Type NAME_BUFFER
name As String * NCBNAMSZ
name_num As Integer
name_flags As Integer
End Type
Private Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End Type
Private Declare Function Netbios Lib "" (pncb As
NET_CONTROL_BLOCK) As Byte
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
(hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long,
ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long,
ByVal dwFlags As Long, lpMem As Any) As Long
‘获取网卡物理地址的主函数
Private Sub Command1_Click() '获取网卡物理地址
Dim i As Integer
Dim pASTAT As Long
Dim NCB As NET_CONTROL_BLOCK
Dim AST As ASTAT
_command = NCBRESET
Call Netbios(NCB)
_callname = "*"
_command = NCBASTAT
_lana_num = 0
_length = Len(AST)
pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or
HEAP_ZERO_MEMORY, _length)
_buffer = pASTAT
Call Netbios(NCB)
CopyMemory AST, _buffer, Len(AST)
For i = 0 To 5 '显示网卡物理地址
= & Format(Hex(r_address(i)),
"00") & ""
Next i
HeapFree GetProcessHeap(), 0, pASTAT
End Sub
‘双击右边Command控件进入编程窗口,输入程序代码如下:
Private Sub Command2_Click()
End
End Sub
三.实习中的问题
1.Private Sub Form_Load()
逐句查找错误缺少End Sub,查看帮助Exit procedure 语句必须与 Exit
procedure 发生在其中的过程匹配。
这个错误的起因与解决方法如下所示:
使用 End Function 或 End Property 来结束一个子过程。
在此请使用 End Sub。
End Sub 必要的,用于结束一个 Sub 语句。 在执行时,End 语句会重置所有
模块级别变量和所有模块的静态局部变量。若要保留这些变量的值,改为使用
Stop 语句,则可以在保留这些变量值的基础上恢复执行。
要注意 End 语句不调用 Unload、QueryUnload、或 Terminate 事件或任何
其它 Visual Basic 代码,只是生硬地终止代码执行。窗体和类模块中的
Unload、QueryUnload、和 Terminate 事件代码未被执行。类模块创建的对象
被破坏,由 Open 语句打开的文件被关闭,并且释放程序所占用的内存。其它
程序的对象引用无效。
End 语句提供了一种强迫中止程序的方法。Visual Basic 程序正常结束应该卸
载所有的窗体。只要没有其它程序引用该程序公共类模块创建的对象并无代码
执行,程序将立即关闭。
Sub 过程可以是递归的;也就是说,该过程可以调用自己来完成某个特定的任
务。不过,递归可能会导致堆栈上溢。通常 Static 关键字和递归的 Sub 过程
不在一起使用。
所有的可执行代码都必须属于某个过程。不能在别的 Sub、Function 或
Property 过程中定义 Sub 过程。
Exit Sub 语句使执行立即从一个 Sub 过程中退出。程序接着从调用该 Sub 过
程的语句下一条语句执行。在 Sub 过程的任何位置都可以有 Exit Sub 语句。
Sub 过程与 Function 过程的相似之处是:它们都一个可以获取参数,执行一
系列语句,以及改变其参数的值的独立过程。而与 Function 过程不同的是:
带返回值的 Sub 过程不能用于表达式。
可以使用过程名并后跟相应的参数列表来调用一个 Sub 过程。请参阅 Call 语
句关于如何调用 Sub 过程的详细的说明信息。
在 Sub 过程中使用的变量分为两类:一类是在过程内显式定义的,另一类则不
是。在过程内显式定义的变量(使用 Dim 或等效方法)都是局部变量。对于使
用了但又没有在过程中显式定义的变量,除非其在该过程外更高级别的位置有
显示地定义,否则也是局部的。
一些基本概念:
过程
命名的语句序列,可作为单元来执行。例如,Function、Property和 Sub 都是
过程类型。总是在模块级别定义过程的名称,所有可执行的代码必须包含在过
程内,一过程不能套在其它过程中。
Private
变量,只对声明了它们的模块是可见的。
过程级别
描述 Function、Property、或 Sub 过程中的语句。通常先列举声明,其次是
赋值和其它可执行的代码。
注意,模块级别代码驻留在过程块之外。
2.找不到指定的文件(错误 53)
所指定的文件找不到。
此错误有以下的原因和解决方法:
如 Kill、Open 或 Name 等语句,引用到一个不存在的文件。
检查文件名的拼写以及指定的路径。
试图调用动态链接库 (DLL)中的过程,但找不到在 Declare 语句的 Lib 子句
中所指定的库文件名。
检查文件名的拼写以及指定的路径。
在开发环境中,如果试图打开并不存在的工程或装载不存在的文本文件,将发
生错误。
检查文件名或工程名的拼写以及指定的路径。
3无效的字符
该字符不能被用于当前的内容中。这个错误的起因与解决方法如下所示:
可能使用了无效的字符,如括号或连字号,做为变量名称的一部分。
请比较此名称的拼写与其声明是否一致。
4.期待:
语法中的期待部分没有找到。这个错误通常位于被选项的左方,但并不总是明
显的。例如,可以用、也可不用 Call 关键字来调用子过程。然而,假如用了
Call 关键字,必须将参数括在括号内。这个错误的起因与解决方法如下所示:
期待:语句的结尾。在过程调用中不适当地使用括号:
•
X = F:= 5 ' 错误起因於没有括号。
•
Call MySub 5 ' 错误起因於没有括号。
•
请在函数调用中使用指定参数的括号,或在使用 Call 关键字的子过程
调用中使用括号。
期待: )。过程调用的不正确语法。例如,函数调用单独出现,而子过
程调用有时候需要 Call 关键字,依赖於如何指定它们的参数。
•
(X:=5, Y:=7) ' 没有表达式的函数调用。
•
YourSub(5, 7) ' 没有 Call 的子过程调用。
•
在表达式中总是使用函数调用。如果在子过程调用的括号内有多个的参
数时,必须使用 Call 关键字。
期待:表达式。例如,当从对象浏览器中粘贴代码时,可能忘记给命名
参数赋值。
•
(X:= ) ' 错误因为没有给
•
' 命名的参数赋值。
•
或者为该参数添加一个值,或者如果它是可选的,就删除它。
期待:变量。例如,也许对变量名使用了限制关键字。在下面的示例中,
Input # 语句期待一个变量作为其第二个参数。因为 Type 是一个限制
性的关键字,因此它不能作为变量名。
•
Input # 1, Type ' Type 关键字不能用作
•
' 变量名。
•
请重新命名变量,使其不再与限制性关键字冲突。
5.在写注释时,注释前的‘必须是英文的,不能是别的输入法时的‘,否则编
译会出错,错误是“无效字符”。
四。测试结果
1.测试目的:
读取本地机器网卡的MAC地址。
2.运行程序,单击“获取”按钮,即可获取网卡的物理地址,单击“退出”
按钮,即可退出程序。实验结果如下图
五。实验体会
通过这两周的计算机编程实习,使我学到了不少知识,很多方面都得到
了锻炼,特别是问题分析、自学能力、纪律执行、实习操作等。由于我们以前
没有学过用vb编程,所以尤其还考察了我查找资料、自学新知识、借鉴方案、
描绘流程思想等各项能力。使我对应用计算机软硬件以及编程能力也有了提高。
还提高了我遵守实验室规章制度等自觉性。通过这两周的计算机编程实习,还
使我发现遇到不懂的问题时,请教老师或同学是一种比较有效而且有方便的学
习方法。


发布评论