资源目录
压缩包内文档预览:
编号:21836122
类型:共享资源
大小:16.76MB
格式:ZIP
上传时间:2019-09-06
上传人:QQ24****1780
认证信息
个人认证
王**(实名认证)
浙江
IP属地:浙江
25
积分
- 关 键 词:
-
大学
计算机网络
实验
试验
教程
刘兵
课件
ppt
- 资源描述:
-
大学计算机网络实验教程-刘兵-课件PPT,大学,计算机网络,实验,试验,教程,刘兵,课件,ppt
- 内容简介:
-
计算机网络实验教程武汉工业学院刘兵 等制作第5章 网络编程 学习要点: Visual Basic语言的基本编程方法网络聊天程序的编制方法Winsock控件的使用方法网络数据包的捕获及分析方法 5.1.1 注释与分行 1. 注释注释是非可执行语句,只是对有关的内容加以说明。例如:说明某个过程或函数的功能以及入口和出口参数。在程序中添加注释是个良好的编程习惯。在 Visual Basic.NET中,注释以Rem或撇号开始(注意:以Rem开始的注释是单独的语句,必须另起一行或用冒号与前面的语句分开)。Rem 这是一句注释Rem 这是另一句注释formula = 10 撇号之后的任何文本也是注释formula = 20 : Rem 这也是一句注释注释可以出现在公式文本之后1 .注释可采用行继续符将一条语句写在两行或多行上。将多个语句合并到一行(例如,在您有几个短语句而又想节省空间的时候)。在模块内组织变量或命令时使用此项功能也很方便。 2 . 分行与续行将单个语句拆分为多行 在要拆分行的地方使用行继续符,即由一个空格和一条下划线组成(如“ _”)。以下示例中的语句被拆分出三个带行继续符的行: Data1.RecordSource = _ SELECT * FROM Titles, Publishers _ & WHERE Publishers.PubId = Titles.PubID _ & AND Publishers.State = CA用冒号(:)将各语句分开,如以下示例所示: str1 = Hello : Red = Red : str1 = str1 & Red 将多个语句置于同一行 5.1.2 常量与变量 在程序执行过程中数值始终不改变的变量称为常量。常量分为系统常量和用户自定义常量两种。1. 系统常量系统常量是系统预先定义好的常量,可以在任何脚本中使用,不受作用域与可见性的限制。表5-2 表示空值的常用常量表5-1 布尔常量表5-3 颜色常量 表5-4 日期常量获取系统今天时间获取系统当前日期:System.DateTime.Today获取系统当前日期和时间:System.DateTime.Now2. 用户自定义常量声明常数后,就不能修改它或为它分配新值。可以在过程内或在模块、类或结构的声明部分声明常数。定义常量的形式如下:Const As 类型 = 常量值As子句是可选的,用来说明常量的数据类型,如果省略,则数据类型由表达式决定。 常量值可以是数字、字符串或由它们与运算符组合成的简单表达式。例如: Public Const DaysInYear = 365 (类型?) Private Const WorkDays = 250 编译器为常数分配数据类型。2. 用户自定义常量当Option Strict为On时,必须通过指定数据类型来显式的声明常数。当 Option Strict 为 Off 时,编译器为常数分配数据类型。2. 用户自定义常量如下所示: Option Strict OnPublic Const MyInteger As Integer = 42Private Const DaysInWeek As Short = 7Protected Friend Const Funday As String = Sunday2. 用户自定义常量3 变量变量是指在程序执行过程中其值可以变化的量。变量通过一个名字(变量名)来标识。系统为程序中的每一个变量分配一个存储单元。变量名实质上就是计算机内存单元的命名。因此,借助变量名就可以访问内存中的数据了。 1.变量命名规则VB.NET要求必须遵循以下规则: 变量名必须以字母或下划线()开头。 变量名必须只包含字母、十进制数字和下划线。 如果名称以下划线开头,则必须包含至少一个字母或十进制数字。 变量名不能与系统保留的关键字相同。 变量名长度不能超过16383个字符 变量名在变量的有效范围内必须是惟一的。 变量名不区分大小写(或者说对大小写不敏感)2. 变量的数据类型变量的数据类型决定了如何将变量的值存储到计算机的内存中。例如,某个变量的数据类型为整型(存放整数),但是如果在代码中将一个字符串赋给该变量,则运行程序时会出现类型不能转换的错误。3. 变量的声明与赋值语句(1)变量的声明程序运行时,变量声明在内存中为变量分配空间,并使系统了解随后要处理数据的数据类型。变量声明的语句形式如下:Dim 变量名As数据类型初值3. 变量的声明与赋值语句例如: Dim i As Integer = 100 Dim j As Double 先声明一个变量,然后再赋值j = 3.14当给变量赋值后,根据所赋的值,系统会自动调整变量的类型。例如:Dim str1 此时所定义的str1变量为Object类型Str1 = “student”(2)赋值语句赋值语句执行赋值运算。简单的赋值运算包括采用运算符右侧的值并将其赋予左侧的变量,如下列示例中所示:x = 42运算符右侧的值可以是任何文本、变量、表达式或返回值的函数调用,如下列示例中所示:x = y + z + MyFunction(3)(2)赋值语句赋值运算符还可将值赋予 String 变量和 String 表达式,如下列示例中所示: Dim x As Stringx = String variable assignmentx = Con & cat & enation5.1.3 运算符与表达式 1 . 算术运算符算术运算符用于组合数字、数值变量、数值字段和数值函数以得到另一个数字。用于连接运算表达式的各种算术运算符。表5-6 算术运算符赋值运算符赋值运算符用于赋值运算。比较运算符比较运算符用于比较两个对象之间的相互关系,返回值为True和False。表5-9 显示 pattern 中允许的字符和这些字符的匹配项下列示例使用 Like 运算符将字符串与模式比较。结果是 Boolean 值,它表示该字符串是否符合该模式。下面的返回值是:Dim myCheck As BooleanmyCheck = F Like F myCheck = aBBBa Like a*a myCheck = F Like A-Z myCheck = F Like !A-ZmyCheck = a2a Like a#a myCheck = aM5b Like aL-P#!c-e myCheck = BAT123khg Like B?T* myCheck = CAT123khg Like B?T* 逻辑运算符逻辑运算符的作用是对操作数进行逻辑运算。操作数可以是逻辑量(True或False)或关系表达式。逻辑运算的结果也是一个逻辑量。下面是一些示例:Dim x As Booleanx = Not 23 12 x = False.x = Not 23 67 x = True.x = 23 12 And 12 4 x = Truex = 12 23 And 12 4 x = Falsex = 23 12 Or 4 12 x = Truex = 23 45 Or 4 12 x = Falsex = 23 45 Xor 12 4 x = Truex = 23 12 Xor 12 4 x = Falsex = 12 23 Xor 4 12 x = False 字符串运算符1. & 运算符& 运算符生成两个表达式的字符串连接。格式: result = expression1 & expression2如果 expression1 或 expression2 的数据类型不是 String,则被转换为 String。result 的数据类型为 String。例如:Dim myStr As StringmyStr = Hello & World字符串运算符2. +运算符将两个数相加。也用于连接两个字符串。运算符优先级5.1.4 数组数组允许您通过同一名称引用一系列的变量,并使用一个称为“索引”或“下标”的数字来进行区分。数组可以是一维也可以是多维数组。在数组的每一维中,数组元素按下标0到该维最高下标值连续排列。声明数组变量1. 声明单维数组变量 Dim MySingleArray(3) As Integer Dim MyArray(3) As Integer =1,5,7,12 声明一个一维数组,同时对数组赋值2. 声明多维数组变量 在声明中,在变量名后添加一对圆括号并将逗号置于圆括号中以分隔维数,如下例所示:Dim My2DArray(3,2) As IntegerDim My2DArray(3,2) As Integer =2,4,1,3,5,6 声明一个二维数组,同时对其进行初始化数组的用法可以声明数组用来处理一组具有相同数据类型的值。一个数组就是一个包含许多单元(用于存储值)的变量,而标量类型的变量(不是数组)只有一个存储单元,只能存放单个值。当要引用数组所包含的所有值时,可以将数组作为一个整体来引用;也可以一次引用一个单独的数组元素。 Sub sum() Dim A(10) As Integer Dim I As Integer For I = 0 to 10 A(I) = I Next I End Sub 如果数组的类型是Object,则可以在数组中混合使用各种数据类型。下面的示例使用了数组变量EmployeeData来存储雇员的信息。 Dim EmployeeData(3) As Object EmployeeData(0) = Ron Bendel EmployeeData(1) = 4242 Maple Blvd EmployeeData(2) = 48 EmployeeData(3) = 06-09-1953 数组的用法Dim I, J As Integer Dim MatrixA(9, 9) As Double Dim MaxDim0, MaxDim1 As Integer 定义获取数组某一维的最大下标值变量 MaxDim0 = MatrixA.GetUpperBound(0) 获得一维的最大下标值MaxDim1 = MatrixA.GetUpperBound(1) 获得二维的最大下标值For I = 0 To MaxDim0 For J = 0 To MaxDim1 MatrixA(I, J) = (I * 10) + J Next J Next I 5.1.5 程序设计的方法 分支语句使用在称之为分支结构的特殊语句块中的条件表达式控制了程序中哪些语句被执行以及以什么样的次序执行。在VB.NET中选择语句又可分为两种:If语句和Select Case语句1. If语句If语句可以在条件为真时执行一系列语句,而在条件不为真时执行其他一系列语句。最简单的If . Then分支结构可以只写在一行: If 条件表达式为真 Then 语句例如:If Score= 20 Then str1 = You Win!If 条件表达式为真 Then 语句块1ELSE 语句块2END IF1. If语句If 条件表达式1为真 Then 语句块1Elseif 条件表达式1为真 Then 语句块2Elseif 条件表达式3为真 Then 语句块3Else 语句块nEND IFDim Number, Digits As IntegerNumber = 53 If Number 10 Then Digits = 1ElseIf Number 100 Then Digits = 2Else Digits = 3End If结果:Digits= . 2. Select Case语句Select Case结构的语法:Select Case VariableCase Value1 当Value1与Variable的值匹配时执行的语句Case Value2 当Value2与Variable的值匹配时执行的语句Case Value3 当Value3与Variable的值匹配时执行的语句Case Else 当没有值与Variable的值匹配时执行的语句End SelectDim Number As Integer = 8Dim Str1 As StringSelect Number Case 1 To 5 Str1 = Between 1 and 5 Case 6, 7, 8 Str1 = Between 6 and 8Case 9 To 10 Str1 = Greater than 8Case Else Str1 = Not between 1 and 10End Select Select Case AgeCase Is 100 Str1 = 长寿者!Case Else Str1 = 这是一个多好的年龄阶段End Select循环语句循环语句用于在一定条件下多次重复执行一组语句。可以根据下列条件重复执行语句:直到条件为真、直到条件为假、指定的次数或为集合中的每个对象执行一次。Visual Basic 支持的循环结构包括: For.Next For Each.Next While Do.Loop 1. For.NextFor counter = start To end Step step 被执行的语句块Next counter Sub Preset(ByRef A() As Integer) Dim I As Integer For I = 1 To UBound(A) A(I) = 128 Next IEnd SubSub TwosTotal() Dim J, Total As Integer For J = 2 To 10 Step 2 Total = Total + J Next JEnd SubSub NewTotal() Dim N, Total As Integer For N = 16 To 4 Step -2 Total = Total + N Next NEnd Sub2. For Each.NextFor Each.Next 循环类似于 For.Next 循环,但它为集合中的每个元素执行语句块,而不是执行指定次数。语法如下所示:For Each elementvariable In collection 被执行的语句块Next elementvariable Sub Preset(ByRef A() As Integer) Dim Elt As Integer For Each Elt In A Elt = 128 Next EltEnd Sub3. Do语句(1)当条件为 True 时重复执行语句使用 While 关键字检查 Do 循环中的条件有两种方法:在进入循环前检查条件在循环至少运行一次后检查条件。在条件保持为 True 时循环会继续下去。Sub CheckWhileFirst() Dim counter as integer = 0 Dim number as integer = 10 Do while number 6 Number = number - 1 Counter = counter + 1 LoopEnd sub Sub CheckWhileLast() Dim counter as integer = 0 Dim number as integer = 5 Do Number = Number - 1 Counter = Counter + 1 Loop While Number 6End SubSub CheckUntilFirst() Dim counter as integer = 0 Dim number as integer = 20 Do until number = 15 Number = number - 1 Counter = counter + 1 LoopEnd sub Sub CheckUntilLast() Dim counter as integer = 0 Dim number as integer = 20 Do Number = Number - 1 Counter = Counter + 1 Loop Until Number = 15End SubSub ExitDoExample() Dim Counter As Integer = 0 Dim Number As Integer = 8 Do Until Number = 10 If Number 6 Number = Number - 1 Counter = Counter + 1 End WhileEnd SubSub ExitWhileExample() Dim counter as integer = 0 Dim number as integer = 8 While number 10 If number 0 then exit while Number = number - 1 Counter = counter + 1 End whileEnd sub5.1.6 Visual Basic函数与过程 5.6.1 基本概念在程序中,有些处理需要经常重复进行,这些处理的代码是相同的,只不过每次都以不同的参数调用,这时就可把这些代码制作成函数与过程。函数可以返回值,而过程则不返回任何值,这就是函数与过程的根本区别。例如,要计算整数1到n的累加过程,n的大小可以由用户决定,因此它是不确定的。这样就可以定义一个以n为参数的过程,为了得到不同n时的累加结果,以不同的参数n调用该过程就可以了。使用过程的好处就在于使得程序简练,同时也便于程序的设计与维护。 1. Sub 过程Sub 过程是包含在 Sub 语句和 End Sub 语句中的一系列 Visual Basic 语句。每次调用过程时都执行过程中的语句,从 Sub 语句后的第一个可执行语句开始,到遇到的第一个 End Sub、Exit Sub 或 Return 语句结束。5.6 函数与过程 5.6.1 基本概念函数可以返回值,而过程则不返回任何值,这就是函数与过程的根本区别。使用过程的好处就在于使得程序简练,同时也便于程序的设计与维护。 (1)声明 Sub 过程声明 Sub 过程的语法如下所示:可访问性 Sub subname(argumentlist) Sub过程所执行的语句End Sub(2)调用语法调用 Sub 过程的语法如下所示: Call subname(参数列表)以下是子程序示例:Sub ComputeArea(ByVal Length As Double, ByVal Width As Double) Dim Area As Double If Length = 0 Or Width = 0 Then Exit Sub 立即退出过程. End If Area = Length * Width 计算Area response.write(Area) 输出结果End Sub典型的ComputeArea调用如下所示: Call ComputeArea(10.1 , 200.5) 2. Function过程Function 过程与 Sub 过程相似,但它还向调用程序返回值。Function 过程可以带呼叫代码传递给它的参数,如常数、变量或表达式。 (1)声明Function过程声明 Function 过程的语法如下所示:可访问性 Function 过程名(参数列表) As 数据类型 Function过程的语句.End Function(2)返回值Function 过程发送回调用程序的值称为它的“返回值”。函数使用以下两种方式之一返回值: 它在过程的一个或多个语句中给自己的函数名赋值。直到执行了 Exit Function 或 End Function 语句,控制才返回给调用程序,如下面的示例所示: Function sum(i,j) As Integer . Return ( i + j ) 指定返回值 . End Function(3)调用语法调用 Function 过程的方法是将其名称和参数放在赋值语句的右边或表达式中。lvalue = functionname(argumentlist)If (functionname(argumentlist) / 3) = expression) Then .例如调用上面定义的sum函数的方法是: total = sum(12 , 24 )VB.NET的常用函数1. 字符串函数字符串函数用于对字符串进行处理和操作。表5-12 常用的字符串函数下面是字符串函数应用的一些例子。Dim MyString As StringDim MyLen As IntegerDim Str1 As StringMyString = Hello World MyLen = Len(MyString) Str1 = Left(myString, 5) Str1 = Right(myString, 6)MyString = Mid Function Demo Str1 = Mid(MyString, 1, 3) 返回值为Mid.Str1 = Mid(MyString, 14, 4) Str1 = Mid(MyString, 5) MyString =XXpXXpXXPXXPStr1 = P str1 = InStr(4, MyString, str1, CompareMethod.Text) MyString = Shopping ListStr1= Replace(MyString, o, i) MyString = ABCDEFGStr1= StrReverse(myString) 2. 日期函数下面是日期函数应用的一些例子。Dim MyDate As DateDim MyValue As IntegerMyDate = #9/20/2003# MyValue = Microsoft.VisualBasic.Day(MyDate) MyValue = Month(MyDate) MyValue = Year(MyDate) MyValue = Weekday(MyDate)3. 类型转换函数4. 其他函数下面是这些函数应用的一些例子。Dim UpperCase, LowerCase As StringUppercase = Hello World 1234 Lowercase = LCase(UpperCase) Dim MyArray(4), YourArray(3) As Integer Dim MyString As StringDim MyCheck As Boolean5.1.7 Visual Basic程序设计的事件 5.2.1 Winsock规范 通信的基础是套接字,一个套接字包括一个IP地址(32bit)和一个端口号(16bit)共48bit,套接字是指通信的一端,套接字可以根据通信性质分类,这种性质对于用户是可见的,且应用程序一般仅在同一类的套接字间通信。套接字有两种不同的类型:流套接字和数据报套接字。 5.2.1 Winsock规范 (1)流套接字 流套接字提供双向的、有序的、无重复并且无记录边界的数据流服务,它适用于处理大量数据。网络传输层可以将数据分散或集中到合适尺寸的数据包中。 (2)数据报套接字数据报套接字支持双向的数据流,但并不保证数据传输的可靠性、有序性和无重复性。也就是说,一个从数据报套接字接收信息的进程有可能发现信息重复,或者和发出时的顺序不同的情况。此外,数据报套接字的一个重要特点是它保留了记录边界。 5.2.2 Winsock控件的属性、方法和事件 1. Winsock控件的属性 表5-13 State属性值2. Winsock的方法 (1)Accept方法仅适用于TCP服务器应用程序。在处理ConnectionRequest事件时用这个方法接受新连接,使用语法如下:Winsock1.Accept requestID(2)Bind方法指定用于TCP连接的LocalPort和LocalIP。使用的语法如下:Winsock1.Bind LocalHost , LocalIP(3)Close方法对客户机和服务器应用程序TCP连接或侦听套接字。使用语法如下:Winsock1.Close2. Winsock的方法 (4)GetData方法获取当前的数据块并将其存储在变体类型的变量中。使用语法如下:Winsock1.GetData data , type , maxLen(5)Listen方法创建套接字并将其设置为侦听模式。该方法仅适用于TCP连接。使用语法如下:Winsock1.Listen(6)PeekData方法PeekData方法不从输入队列删除数据,除了这一点之外,方法与GetData相似。该方法仅适用于TCP连接。(7)SendData方法将数据发送给远程计算机使用语法如下:Winsock1.SendData data 3. Winsock的事件 4. Winsock控件的使用方法 (1) 选择通讯协议的标准在使用 WinSock 控件时,首先需要考虑使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态 .(2)协议的设置sckTCPProtocol 或者 sckUDPProtocol。也可以使用程序代码来设置 Protocol 属性,如下所示:Winsock1.Protocol = sckTCPProtocol(3)确定计算机的名称 4. Winsock控件的使用方法 (1) 选择通讯协议的标准在使用 WinSock 控件时,首先需要考虑使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态 .(2)协议的设置sckTCPProtocol 或者 sckUDPProtocol。也可以使用程序代码来设置 Protocol 属性,如下所示:Winsock1.Protocol = sckTCPProtocol5.2.3 Winsock控件TCP协议的使用 1. 服务器端界面 2. 服务器端程序设计 (1)定义程序中的全局变量Option ExplicitDim RecevieData As String 接收数据Dim IntMax As Integer 使用WinSock控件的最大值(2)在form_load中,进行变量初始化。Private Sub Form_Load()On Error Resume Next出错处理 lbListen.LocalPort = 1011 初始化本地主机端口lbListen.Listen开始监听Label4.Caption = lbListen.LocalIP显示本地的IP地址End Sub2. 服务器端程序设计 (3)当客户端有连接请求时,在服务器端触发ConnectionRequest事件,其事件处理程序代码如下:Private Sub lbListen_ConnectionRequest(ByVal requestID As Long) If Index 15 Then IntMax = IntMax + 1 Load Winsock1(IntMax) Winsock1(IntMax).LocalPort = 0 Winsock1(IntMax).Accept requested Label5.Caption = lbListen(IntMax).RemoteHostIPEnd Sub2. 服务器端程序设计 (4)在DataArrival事件被触发后程序把接受到的数据放在了Vbstring中,并将它显示在文本框中。(5)现在,在服务器端既能监听又能接收数据,而且还能把接收的数据显示出来,关闭事件处理程序如下:Private Sub lbListen_Close() If sock(sockIndex).State sockClosed Then sock(sockIndex).Close End IfEnd Sub(6)单击“退出”按钮Click事件。Private Sub Command1_Click() Unload MeEnd Sub3. 客户端程序设计 (1)定义变量Dim remoteHost As StringDim remoteport As Long3. 客户端程序设计 (2)当用户单击“发送”按钮之后,所触发的事件处理程序如下:Private Sub Command1_Click() remoteHost = Text2.TextText2文本框中所输入的IP地址 If Winsock1.State sckConnected Then If Winsock1.State sckClosed Then Winsock1.CloseWinsock控件关闭连接 End If Winsock1.Connect remoteHost, remoteport 根据所设定的远程主机和远程端口进行连接 Else Label1.Caption = 已连接 Winsock1.SendData Text1.Text发送数据 End IfEnd Sub3. 客户端程序设计 (3)其它事件程序Private Sub Form_Load() remoteport = 1011 remoteHost = Text2.Text Label1.Caption = 可以开始了End SubPrivate Sub Text2_Change() remoteHost = Text2.TextEnd SubPrivate Sub Winsock1_Close() If Winsock1.State Closed Then Winsock1.Close Command1.Enabled = False Label1.Caption = 连接关闭 End IfEnd Sub5.2.5 Winsock控件UDP协议的使用 1. Winsock控件UDP协议的使用说明 (1)将 RemoteHost 属性设置为另一台计算机的名称或者IP地址。(2)将 RemotePort 属性设置为另一台计算机Winsock控件所绑定的 LocalPort 属性。(3)调用 Bind 方法,指定使用的LocalPort。 2. UDP聊天程序的一端 (1)创建一个新的Standard EXE 工程。(2)将缺省的窗体的名称修改为PeerA。(3)将窗体的标题修改为“服务器端”。(4)在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerA。(5)在Winsock 控件的“属性”页上,单击“Protocol”属性,并将该属性值修改为 UDPProtocol。(6)在窗体中添加两个TextBox控件。将第一个命名为 txtSend,第二个命名为 txtOutput。(7)为窗体增加如下的代码。 Private Sub Form_Load()With udpPeerA.RemoteHost= LBLiubing .RemotePort = 1001 .Bind 1002 End WithEnd SubPrivate Sub txtSend_Change() udpPeerA.SendData txtSend.TextEnd SubPrivate Sub udpPeerA_DataArrival (ByVal bytesTotal As Long)Dim strData As StringudpPeerA.GetData strDatatxtOutput.Text = strDataEnd Sub3. UDP的聊天程序的另一端 (1) 在工程中添加一个标准窗体。(2) 将窗体的名字修改为 frmPeerB。(3) 将窗体的标题修改为“Peer B”。(4) 在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerB。(5) 在“属性”页上,单击“协议”并将协议修改为“UDPProtocol”。(6) 在窗体上添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。(7)在窗体中添加如下的代码。 Private Sub Form_Load()With udpPeerB.RemoteHost=jljiangli“.RemotePort = 1002 .Bind 1001 End WithEnd SubPrivate Sub txtSend_Change()udpPeerB.SendData txtSend.TextEnd SubPrivate Sub udpPeerB_DataArrival (ByVal bytesTotal As Long)Dim strData As StringudpPeerB.GetData strDatatxtOutput.Text = strDataEnd Sub5.3.1 网络监听的原理 1. 以太网的工作原理 把网卡设置为“混杂模式”,这样不管网络中的数据包是否是传送给本地主机,这种模式的网卡都接收。 在正常的情况下,一个网络接口应该只响应这样的两种数据帧:(1)与自己硬件地址相匹配的数据帧。(2)发向所有机器的广播数据帧。 2. 网卡的工作原理 对于网卡一般有四种接收模式: (1)广播方式:该模式下的网卡能够接收网络中的广播信息。(2)组播方式:设置在该模式下的网卡能够接收组播数据。(3)直接方式:在这种模式下,只有目的网卡才能接收该数据。(4)混杂模式:在这种模式下的网卡能够接收一切通过它的数据,而不管该数据是否是传给它的。 3. 网络监听的工作原理 (1)在以太网中是基于广播方式传送数据的,也就是说,所有的物理信号都要经过同一网段的所有网络设备。(2)网卡可以置于一种模式叫混杂模式(promiscuous mode),在这种模式下工作的网卡能够接收到一切通过它的数据,而不管实际上数据的目的地址是不是它。这就是以下将要介绍的网络监听工作的基本原理:让网卡接收一切它所能接收的数据。 4. 网络监听软件的设计实现 (1)把网卡设置为混杂模式(2)捕获数据包(3)分析数据包5. 分析数据包 5.3.2 数据包捕获工具 1. 数据包捕获工具 注册方法如下:(1)首先要对Winpacp组件进行注册,即双击该组件图标。(Winpacp组件和packet.dll文件可在水电出版社网站下载)(2)在包括packet.dll文件的文件夹下,用“开始程序附件记事本”软件建立一个批处理文件,文件的名字后缀一定要是“.bat”,如“regpacketvb.bat”。文件中的内容如下: regsvr32 packetvb.dll(3)执行新建立的批处理文件。 2. vbpcap的引用方式 定义用于采集数据包的变量,方法如下:Public WithEvents vpacket As vbPacketSet vpacket = New vbPacket(1)获取网卡名字的方法GetAdapterNames (AdapterNamesStr as String) as Long该方法中的参数AdapterNamesStr的尺寸必须通过显式定义,例如:Dim AdapterNames As String * 10003. Packetvb的的方法 Private Sub Form_Load()Dim adapterNames As String * 1000Set vpacket = New vbPacketCurrentSelectedAdapter = numAdapters = vpacket.GetAdapterNames(adapterNames)AdapterNamesList = Split(adapterNames, vbNullChar)For i = 0 To numAdapters List1.AddItem (AdapterNamesList(i) Next iEnd Sub3. Packetvb的的方法 (3)获取网卡信息GetNetInfo方法可获取指定网卡的IP地址和子网掩码。其使用语法如下:GetNetInfo(AdapterName as string,netIP as long,netMask as long)3. Packetvb的的方法 Private Sub Command1_Click() Dim netIP As Long Dim netMask As Long CurrentSelectedAdapter = List1.List(List1.ListIndex) If CurrentSelectedAdapter Then vpacket.GetNetInfo CurrentSelectedAdapter, netIP, netMask Label3.Caption = GetIpFromLong(netIP) Label5.Caption = GetIpFromLong(netMask) Else MsgBox 请先选择一个网卡后,才能显示该网卡的IP和子网掩码! End IfEnd SubPublic CurrentSelectedAdapter As StringPublic Declare Sub memcpy Lib kernel32 Alias _ RtlMoveMemory (ByRef Destination As Any, _ ByRef Source As Any, ByVal Length As Long)Public Function GetIpFromLong(lngIPAddress As Long) As String Dim arrIpParts(3) As Byte memcpy arrIpParts(0), lngIPAddress, 4 GetIpFromLong = CStr(arrIpParts(3) & . & _ CStr(arrIpParts(2) & . & _ CStr(arrIpParts(1) & . & _ CStr(arrIpParts(0)End Function4. Packetvb的属性 5. 事件 Packetvb仅有一个事件,即PacketReceived事件,其语法如下:PacketReceived(numerofbytes As Long)5.3.3 数据包的捕获 For i = 0 To numAdapters vpacket.GetNetInfo AdapterNamesList(i), netip, netmask If netip 0 Then CurrentSelectedAdapter = ToolBar1.Buttons(5).ButtonMenus(i + 1).Text txtAdapter.Text = ToolBar1.Buttons(5).ButtonMenus(i + 1).Text txtIP.Text = GetIpFromLong(netip) txtMask.Text = GetIpFromLong(netmask) ToolBar1.Buttons.Item(2).Enabled = True Exit For End IfNext i5.3.3 数据包的捕获 If CurrentSelectedAdapter = Then MsgBox You must select an adapter first, vbOKOnly, Adapter? Exit Sub End If 清除lsvPackets控件中的内容 lsvPackets.ListItems.Clear 清除trvProtocols控件中的内容 trvProtocols.Nodes.Clear 捕获包的数量变量清零 PacketCount = 0 5.3.3 数据包的捕获 ToolBar1.Buttons.Item(2).Enabled = False 关闭开始按钮 ToolBar1.Buttons.Item(3).Enabled = True 打开停止铵钮 ToolBar1.Buttons.Item(5).Enabled = False 关闭网卡选择按钮 打开目前所选择的网卡 vpacket.OpenAdapter (CurrentSelectedAdapter) 设置网卡的模式为混杂模式 vpacket.HWFilter = PACKET_TYPE_PROMISCUOUS 设置超时时间为1000 vpacket.ReadTimeOut = 1000 定为第一个数据包 vpacket.AllocatePacket 然后初始化缓冲区的尺寸 vpacket.InitPacket (UBound(ByteArray) 设置缓冲区尺寸 vpacket.BufferSize = UBound(ByteArray) 开始捕获 vpacket.StartCapture5.3.3 数据包的捕获 4. PacketVB的PacketReceived事件程序:Private Sub vpacket_PacketReceived(numbytes As Long)Dim SrcMacAddr As StringDim DestMacAddr As StringDim ipHead As IPv4HeaderDim PosInBuffer As LongDim ThisEtherNetHeader As EtherNetHeaderDim NextProto As LongDim EHeader As EtherNetHeader 包数累加 PacketCount = PacketCount + 1 置包数到状态栏 StatusBar1.Panels(StatusBar1.Panels.Count - 1).Text = Packets: & PacketCount 获得包,并填充字节数组 vpacket.GetRawPacketData ByteArray 设定偏移量 PosInBuffer = 05.3.3 数据包的捕获 ThisPacketHeader = GetFrameHeader(ByteArray, NextProto) 这个数据包存储数组的尺寸 ReDim Preserve ThisPacketBytes(PacketCount + 1) ReDim Preserve ThisPacketDataSize(PacketCount + 1) ThisPacketDataSize(PacketCount) = numbytes 重新定义数组尺寸 ReDim ThisPacketBytes(PacketCount).ByteArray(numbytes) 填充存储字节的数组 For i = PosInBuffer To PosInBuffer + numbytes ThisPacketBytes(PacketCount).ByteArray(i) = ByteArray(i) Next i StatusBar1.Panels(StatusBar1.Panels.Count).Text = Bytes: & ThisPacketHeader.CapLength EHeader = GetEtherNetHeader(ByteArray, NextProto, NextProto) lsvPackets.ListIte
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。