效果图如下:
附源码:
1、frmSniffer
Public
Class frmSniffer
Class frmSniffer
变量定义#Region "变量定义"
Dim WithEvents Sniffer As Receiver
#End Region
构造函数#Region "构造函数"
Public Sub New()Sub New()
' 此调用是 Windows 窗体设计器所必需的。
InitializeComponent()
' 在 InitializeComponent() 调用之后添加任何初始化。
End Sub
#End Region
主菜单事件#Region "主菜单事件"
Private Sub 退出CToolStripMenuItem_Click()Sub 退出CToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 退出CToolStripMenuItem.Click
Me.Close()
End Sub
Private Sub 开始捕获数据SToolStripMenuItem_Click()Sub 开始捕获数据SToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles 开始捕获数据SToolStripMenuItem.Click
Try
If Sniffer Is Nothing Then
Sniffer = New Receiver
Sniffer.StartReceive()
Sniffer.ContinueReceive = True
End If
开始捕获数据SToolStripMenuItem.Enabled = False
停止捕获数据BToolStripMenuItem.Enabled = True
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
End Try
End Sub
Private Sub 停止捕获数据BToolStripMenuItem_Click()Sub 停止捕获数据BToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 停止捕获数据BToolStripMenuItem.Click
If Sniffer IsNot Nothing Then
Sniffer.ContinueReceive = False
Sniffer = Nothing
End If
开始捕获数据SToolStripMenuItem.Enabled = True
停止捕获数据BToolStripMenuItem.Enabled = True
End Sub
Private Sub 状态栏ToolStripMenuItem_Click()Sub 状态栏ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 状态栏ToolStripMenuItem.Click
状态栏ToolStripMenuItem.Checked = Not 状态栏ToolStripMenuItem.Checked
StatusStrip.Visible = 状态栏ToolStripMenuItem.Checked
End Sub
Private Sub 数据ToolStripMenuItem_Click()Sub 数据ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 数据ToolStripMenuItem.Click
数据ToolStripMenuItem.Checked = Not 数据ToolStripMenuItem.Checked
TreeViewPackData.Visible = 数据ToolStripMenuItem.Checked
End Sub
Private Sub 数据包详细信息ToolStripMenuItem_Click()Sub 数据包详细信息ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 数据包详细信息ToolStripMenuItem.Click
数据包详细信息ToolStripMenuItem.Checked = Not 数据包详细信息ToolStripMenuItem.Checked
TreeViewPackInfo.Visible = 数据包详细信息ToolStripMenuItem.Checked
End Sub
Private Sub 关于AToolStripMenuItem_Click()Sub 关于AToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 关于AToolStripMenuItem.Click
Dim frm As New frmAbout
frm.ShowDialog()
End Sub
Private Sub 新文件NToolStripMenuItem_Click()Sub 新文件NToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新文件NToolStripMenuItem.Click
TreeViewIpInfo.Nodes(0).Nodes.Clear()
TreeViewPackData.Nodes.Clear()
TreeViewPackInfo.Nodes.Clear()
End Sub
Private Sub 打开文件OToolStripMenuItem_Click()Sub 打开文件OToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 打开文件OToolStripMenuItem.Click
Dim cd As New System.Windows.Forms.OpenFileDialog
With cd
.FileName = ""
.Title = "打开Sniffer文件"
.Filter = "Sniffer文件(*.wzm)|*.wzm"
.ShowDialog()
End With
If cd.FileName <> "" Then Call LoadNodes(TreeViewIpInfo, cd.FileName)
End Sub
Private Sub 保存SToolStripMenuItem_Click()Sub 保存SToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 保存SToolStripMenuItem.Click
Call TreeViewFunction.CreateList(TreeViewIpInfo.Nodes(0), fPath)
End Sub
Private Sub 另存为ToolStripMenuItem_Click()Sub 另存为ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 另存为ToolStripMenuItem.Click
Dim cd As New System.Windows.Forms.SaveFileDialog
With cd
.FileName = ""
.Title = "保存Sniffer数据"
.Filter = "Sniffer文件(*.wzm)|*.wzm"
.ShowDialog()
End With
If cd.FileName <> "" Then Call TreeViewFunction.CreateList(TreeViewIpInfo.Nodes(0), cd.FileName)
End Sub
Private Sub 网管MToolStripMenuItem_Click()Sub 网管MToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 网管MToolStripMenuItem.Click
Dim frm As New frmNetManager
frm.Show()
End Sub
#End Region
窗体事件#Region "窗体事件"
Private Sub frmSniffer_Load()Sub frmSniffer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TreeViewIpInfo.Nodes.Add("No Tcp/Ip Packets")
End Sub
Private Sub FrmSniffer_Closing()Sub FrmSniffer_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
If MsgBox("确定要退出Sniffer吗?", MsgBoxStyle.Question Or MsgBoxStyle.OkCancel, "Info") = MsgBoxResult.Cancel Then
e.Cancel = True
Else
If Sniffer IsNot Nothing Then
Sniffer.ContinueReceive = False
Sniffer.StopReceive()
Sniffer = Nothing
End If
End If
End Sub
#End Region
捕获信息触发的事件#Region "捕获信息触发的事件"
Private Delegate Sub RunMySub()Sub RunMySub(ByVal Packet() As Byte)
Private Sub RefreshTreeViewIpInfo()Sub RefreshTreeViewIpInfo(ByVal PacketDataReceived() As Byte)
Dim tt As New PacketInfo(PacketDataReceived)
Dim SourceIpEndPoint As System.Net.IPEndPoint = tt.Source, DestIpEndPoint As System.Net.IPEndPoint = tt.Destionation
Dim FindIp As Boolean = False
Try
For Each FindIpNode As System.Windows.Forms.TreeNode In TreeViewIpInfo.Nodes(0).Nodes
If FindIpNode.Text = SourceIpEndPoint.Address.ToString Or FindIpNode.Text = DestIpEndPoint.Address.ToString Then
FindIpNode = FindIpNode.Nodes.Add(SourceIpEndPoint.ToString.PadRight(25, " ") + "-->" + DestIpEndPoint.ToString.PadLeft(25, " ") + tt.ProtocalName.PadLeft(10, " ") + Now.ToString.PadLeft(20, " "))
FindIpNode.Tag = PacketDataReceived
FindIp = True
Exit For
End If
Next
If Not FindIp Then
Dim FindIpNode As System.Windows.Forms.TreeNode = TreeViewIpInfo.Nodes(0).Nodes.Add(SourceIpEndPoint.Address.ToString)
FindIpNode = FindIpNode.Nodes.Add(SourceIpEndPoint.ToString.PadRight(25, " ") + "-->" + DestIpEndPoint.ToString.PadLeft(25, " ") + tt.ProtocalName.PadLeft(10, " ") + Now.ToString.PadLeft(20, " "))
FindIpNode.Tag = PacketDataReceived
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Add new or modify an exists node")
End Try
'释放资源
tt = Nothing : SourceIpEndPoint = Nothing : DestIpEndPoint = Nothing
End Sub
Private Sub Sniffer_DataReceived()Sub Sniffer_DataReceived(ByVal data() As Byte, ByVal Length As Integer) Handles Sniffer.DataReceived
Me.Invoke(New RunMySub(AddressOf RefreshTreeViewIpInfo), data)
End Sub
#End Region
TreeViewIpInfo事件#Region "TreeViewIpInfo事件"
Private Sub TreeViewIpInfo_AfterSelect()Sub TreeViewIpInfo_AfterSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeViewIpInfo.AfterSelect
Dim Data() As Byte = CType(e.Node.Tag, Byte())
TreeViewPackData.Nodes.Clear()
TreeViewPackInfo.Nodes.Clear()
If Data IsNot Nothing Then
Call RefreshTreeViewPackData(Data)
Call RefreshTreeViewPackInfo(Data)
End If
End Sub
#End Region
显示某个数据包#Region "显示某个数据包"
Data#Region "Data"
Private Sub RefreshTreeViewPackData()Sub RefreshTreeViewPackData(ByVal Data() As Byte)
Dim strData
变量定义#Region "变量定义"
Dim WithEvents Sniffer As Receiver
#End Region
构造函数#Region "构造函数"
Public Sub New()Sub New()
' 此调用是 Windows 窗体设计器所必需的。
InitializeComponent()
' 在 InitializeComponent() 调用之后添加任何初始化。
End Sub
#End Region
主菜单事件#Region "主菜单事件"
Private Sub 退出CToolStripMenuItem_Click()Sub 退出CToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 退出CToolStripMenuItem.Click
Me.Close()
End Sub
Private Sub 开始捕获数据SToolStripMenuItem_Click()Sub 开始捕获数据SToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles 开始捕获数据SToolStripMenuItem.Click
Try
If Sniffer Is Nothing Then
Sniffer = New Receiver
Sniffer.StartReceive()
Sniffer.ContinueReceive = True
End If
开始捕获数据SToolStripMenuItem.Enabled = False
停止捕获数据BToolStripMenuItem.Enabled = True
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
End Try
End Sub
Private Sub 停止捕获数据BToolStripMenuItem_Click()Sub 停止捕获数据BToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 停止捕获数据BToolStripMenuItem.Click
If Sniffer IsNot Nothing Then
Sniffer.ContinueReceive = False
Sniffer = Nothing
End If
开始捕获数据SToolStripMenuItem.Enabled = True
停止捕获数据BToolStripMenuItem.Enabled = True
End Sub
Private Sub 状态栏ToolStripMenuItem_Click()Sub 状态栏ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 状态栏ToolStripMenuItem.Click
状态栏ToolStripMenuItem.Checked = Not 状态栏ToolStripMenuItem.Checked
StatusStrip.Visible = 状态栏ToolStripMenuItem.Checked
End Sub
Private Sub 数据ToolStripMenuItem_Click()Sub 数据ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 数据ToolStripMenuItem.Click
数据ToolStripMenuItem.Checked = Not 数据ToolStripMenuItem.Checked
TreeViewPackData.Visible = 数据ToolStripMenuItem.Checked
End Sub
Private Sub 数据包详细信息ToolStripMenuItem_Click()Sub 数据包详细信息ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 数据包详细信息ToolStripMenuItem.Click
数据包详细信息ToolStripMenuItem.Checked = Not 数据包详细信息ToolStripMenuItem.Checked
TreeViewPackInfo.Visible = 数据包详细信息ToolStripMenuItem.Checked
End Sub
Private Sub 关于AToolStripMenuItem_Click()Sub 关于AToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 关于AToolStripMenuItem.Click
Dim frm As New frmAbout
frm.ShowDialog()
End Sub
Private Sub 新文件NToolStripMenuItem_Click()Sub 新文件NToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新文件NToolStripMenuItem.Click
TreeViewIpInfo.Nodes(0).Nodes.Clear()
TreeViewPackData.Nodes.Clear()
TreeViewPackInfo.Nodes.Clear()
End Sub
Private Sub 打开文件OToolStripMenuItem_Click()Sub 打开文件OToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 打开文件OToolStripMenuItem.Click
Dim cd As New System.Windows.Forms.OpenFileDialog
With cd
.FileName = ""
.Title = "打开Sniffer文件"
.Filter = "Sniffer文件(*.wzm)|*.wzm"
.ShowDialog()
End With
If cd.FileName <> "" Then Call LoadNodes(TreeViewIpInfo, cd.FileName)
End Sub
Private Sub 保存SToolStripMenuItem_Click()Sub 保存SToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 保存SToolStripMenuItem.Click
Call TreeViewFunction.CreateList(TreeViewIpInfo.Nodes(0), fPath)
End Sub
Private Sub 另存为ToolStripMenuItem_Click()Sub 另存为ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 另存为ToolStripMenuItem.Click
Dim cd As New System.Windows.Forms.SaveFileDialog
With cd
.FileName = ""
.Title = "保存Sniffer数据"
.Filter = "Sniffer文件(*.wzm)|*.wzm"
.ShowDialog()
End With
If cd.FileName <> "" Then Call TreeViewFunction.CreateList(TreeViewIpInfo.Nodes(0), cd.FileName)
End Sub
Private Sub 网管MToolStripMenuItem_Click()Sub 网管MToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 网管MToolStripMenuItem.Click
Dim frm As New frmNetManager
frm.Show()
End Sub
#End Region
窗体事件#Region "窗体事件"
Private Sub frmSniffer_Load()Sub frmSniffer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TreeViewIpInfo.Nodes.Add("No Tcp/Ip Packets")
End Sub
Private Sub FrmSniffer_Closing()Sub FrmSniffer_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
If MsgBox("确定要退出Sniffer吗?", MsgBoxStyle.Question Or MsgBoxStyle.OkCancel, "Info") = MsgBoxResult.Cancel Then
e.Cancel = True
Else
If Sniffer IsNot Nothing Then
Sniffer.ContinueReceive = False
Sniffer.StopReceive()
Sniffer = Nothing
End If
End If
End Sub
#End Region
捕获信息触发的事件#Region "捕获信息触发的事件"
Private Delegate Sub RunMySub()Sub RunMySub(ByVal Packet() As Byte)
Private Sub RefreshTreeViewIpInfo()Sub RefreshTreeViewIpInfo(ByVal PacketDataReceived() As Byte)
Dim tt As New PacketInfo(PacketDataReceived)
Dim SourceIpEndPoint As System.Net.IPEndPoint = tt.Source, DestIpEndPoint As System.Net.IPEndPoint = tt.Destionation
Dim FindIp As Boolean = False
Try
For Each FindIpNode As System.Windows.Forms.TreeNode In TreeViewIpInfo.Nodes(0).Nodes
If FindIpNode.Text = SourceIpEndPoint.Address.ToString Or FindIpNode.Text = DestIpEndPoint.Address.ToString Then
FindIpNode = FindIpNode.Nodes.Add(SourceIpEndPoint.ToString.PadRight(25, " ") + "-->" + DestIpEndPoint.ToString.PadLeft(25, " ") + tt.ProtocalName.PadLeft(10, " ") + Now.ToString.PadLeft(20, " "))
FindIpNode.Tag = PacketDataReceived
FindIp = True
Exit For
End If
Next
If Not FindIp Then
Dim FindIpNode As System.Windows.Forms.TreeNode = TreeViewIpInfo.Nodes(0).Nodes.Add(SourceIpEndPoint.Address.ToString)
FindIpNode = FindIpNode.Nodes.Add(SourceIpEndPoint.ToString.PadRight(25, " ") + "-->" + DestIpEndPoint.ToString.PadLeft(25, " ") + tt.ProtocalName.PadLeft(10, " ") + Now.ToString.PadLeft(20, " "))
FindIpNode.Tag = PacketDataReceived
End If
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Add new or modify an exists node")
End Try
'释放资源
tt = Nothing : SourceIpEndPoint = Nothing : DestIpEndPoint = Nothing
End Sub
Private Sub Sniffer_DataReceived()Sub Sniffer_DataReceived(ByVal data() As Byte, ByVal Length As Integer) Handles Sniffer.DataReceived
Me.Invoke(New RunMySub(AddressOf RefreshTreeViewIpInfo), data)
End Sub
#End Region
TreeViewIpInfo事件#Region "TreeViewIpInfo事件"
Private Sub TreeViewIpInfo_AfterSelect()Sub TreeViewIpInfo_AfterSelect(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeViewIpInfo.AfterSelect
Dim Data() As Byte = CType(e.Node.Tag, Byte())
TreeViewPackData.Nodes.Clear()
TreeViewPackInfo.Nodes.Clear()
If Data IsNot Nothing Then
Call RefreshTreeViewPackData(Data)
Call RefreshTreeViewPackInfo(Data)
End If
End Sub
#End Region
显示某个数据包#Region "显示某个数据包"
Data#Region "Data"
Private Sub RefreshTreeViewPackData()Sub RefreshTreeViewPackData(ByVal Data() As Byte)
Dim strData