在C#中,使用PCAP庫可以實現實時監控網絡流量。以下是一個簡單的示例,展示了如何使用PCAP.NET庫捕獲網絡數據包并進行實時處理。
首先,確保已經安裝了PCAP.NET庫。可以通過NuGet包管理器安裝:
Install-Package PcapDotNet.Core
然后,創建一個C#控制臺應用程序,并添加以下代碼:
using System;
using System.Net.NetworkInformation;
using System.Text;
using PcapDotNet.Core;
using PcapDotNet.Core.DataLinkTypes;
using PcapDotNet.Core.Packets;
using PcapDotNet.Core.Utils;
namespace PcapRealTimeDemo
{
class Program
{
static void Main(string[] args)
{
// 選擇網絡接口
string interfaceName = GetInterfaceName();
if (string.IsNullOrEmpty(interfaceName))
{
Console.WriteLine("未找到網絡接口");
return;
}
// 創建實時捕獲器
using (var capture =
new CaptureFileReader(interfaceName,
PcapFileDevice.GetDeviceList()[0],
new TimeSpan(0, 0, 10), // 讀取10秒的數據包
PcapFileHeader.Default)) // 使用默認的PCAP文件頭
{
Console.WriteLine("開始捕獲數據包...");
// 處理數據包
capture.PacketArrived += (sender, e) =>
{
var packet = e.Packet;
ProcessPacket(packet);
};
// 開始捕獲
capture.Start();
// 等待用戶按下任意鍵停止捕獲
Console.ReadKey();
// 停止捕獲
capture.Stop();
}
}
static string GetInterfaceName()
{
foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())
{
if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 ||
ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
{
return ni.Name;
}
}
return null;
}
static void ProcessPacket(Packet packet)
{
var packetBuilder = new PacketBuilder();
// 添加以太網頭部(如果存在)
if (packet.DataLinkType == DataLinkType.Ethernet)
{
var ethernetPacket = packet.EthernetPacket;
packetBuilder.Append(ethernetPacket);
}
// 添加IP頭部(如果存在)
if (packet.NetworkLayerType == NetworkLayerType.InternetProtocolV4)
{
var ipPacket = packet.InternetProtocolV4Packet;
packetBuilder.Append(ipPacket);
}
// 添加TCP頭部(如果存在)
if (packet.TransportLayerType == TransportLayerType.TransmissionControlProtocol)
{
var tcpPacket = packet.TransmissionControlProtocolPacket;
packetBuilder.Append(tcpPacket);
}
// 獲取處理后的數據包
var processedPacket = packetBuilder.Build();
// 輸出數據包信息
Console.WriteLine($"源IP: {processedPacket.InternetProtocolV4Packet.SourceIpAddress}");
Console.WriteLine($"目標IP: {processedPacket.InternetProtocolV4Packet.DestinationIpAddress}");
Console.WriteLine($"源端口: {processedPacket.TransportLayerType == TransportLayerType.TransmissionControlProtocol ? processedPacket.TransmissionControlProtocolPacket.SourcePort : -1}");
Console.WriteLine($"目標端口: {processedPacket.TransportLayerType == TransportLayerType.TransmissionControlProtocol ? processedPacket.TransmissionControlProtocolPacket.DestinationPort : -1}");
Console.WriteLine($"協議: {processedPacket.TransportLayerType}");
Console.WriteLine();
}
}
}
這個示例程序會捕獲指定網絡接口上的數據包,并在控制臺上顯示源IP、目標IP、源端口、目標端口和協議類型。你可以根據需要修改ProcessPacket
方法來實現自定義的數據包處理邏輯。