Pcap.Net PacketCommunicator.Dispose() 关闭我的应用程序没有任何错误
Pcap.Net PacketCommunicator.Dispose() close my application without any error
我正在使用 Pcap.Net
获取 Pcap
文件并通过我的机器 Network Adapter
传输所有数据包。
所以为了做到这一点,我正在使用代码示例 Sending packets using Send Buffer:
class Program
{
static void Main(string[] args)
{
string file = @"C:\file_1.pcap";
string file2 = @"C:\file_2.pcap";
// Retrieve the device list from the local machine
IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;
// Take the selected adapter
PacketDevice selectedOutputDevice = allDevices[1];
SendPackets(selectedOutputDevice, file);
SendPackets(selectedOutputDevice, file2);
}
static void SendPackets(PacketDevice selectedOutputDevice, string file)
{
// Retrieve the length of the capture file
long capLength = new FileInfo(file).Length;
// Chek if the timestamps must be respected
bool isSync = false;
// Open the capture file
OfflinePacketDevice selectedInputDevice = new OfflinePacketDevice(file);
using (PacketCommunicator inputCommunicator = selectedInputDevice.Open(65536, PacketDeviceOpenAttributes.Promiscuous, 1000))
{
using (PacketCommunicator outputCommunicator = selectedOutputDevice.Open(100, PacketDeviceOpenAttributes.Promiscuous, 1000))
{
// Allocate a send buffer
using (PacketSendBuffer sendBuffer = new PacketSendBuffer((uint)capLength))
{
// Fill the buffer with the packets from the file
Packet packet;
while (inputCommunicator.ReceivePacket(out packet) == PacketCommunicatorReceiveResult.Ok)
{
//outputCommunicator.SendPacket(packet);
sendBuffer.Enqueue(packet);
}
// Transmit the queue
outputCommunicator.Transmit(sendBuffer, isSync);
inputCommunicator.Dispose();
}
outputCommunicator.Dispose();
}
//inputCommunicator.Dispose();
}
}
}
为了发送数据包Pcap.Net
提供了2种方式:
发送缓冲区。
使用SendPacket()
发送每个数据包。
现在完成发送我的 2 个文件后(就像在我的示例中)我想使用 Dispose()
来释放资源。
当使用第一个选项时一切正常,这完成处理我的 2 Pcap
个文件。
当使用第二个选项 SendPacket()
时(目前在我的代码示例中,这是作为注释)在第一个文件完成后我的应用程序将关闭并且不会到达第二个文件。
我也在 Console Application
和 WPF
中尝试过,在这两种情况下结果相同。
使用 UI
(WPF) 我的应用程序 GUI
没有任何错误就关闭了。
任何可能导致此问题的建议?
当您使用 using
关键字时,这意味着您在范围的末尾隐式调用 Dispose()
。
如果您也显式调用 Dispose()
,则意味着您在同一个实例上调用了两次 Dispose()
,这很可能会使您的程序崩溃。
我正在使用 Pcap.Net
获取 Pcap
文件并通过我的机器 Network Adapter
传输所有数据包。
所以为了做到这一点,我正在使用代码示例 Sending packets using Send Buffer:
class Program
{
static void Main(string[] args)
{
string file = @"C:\file_1.pcap";
string file2 = @"C:\file_2.pcap";
// Retrieve the device list from the local machine
IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;
// Take the selected adapter
PacketDevice selectedOutputDevice = allDevices[1];
SendPackets(selectedOutputDevice, file);
SendPackets(selectedOutputDevice, file2);
}
static void SendPackets(PacketDevice selectedOutputDevice, string file)
{
// Retrieve the length of the capture file
long capLength = new FileInfo(file).Length;
// Chek if the timestamps must be respected
bool isSync = false;
// Open the capture file
OfflinePacketDevice selectedInputDevice = new OfflinePacketDevice(file);
using (PacketCommunicator inputCommunicator = selectedInputDevice.Open(65536, PacketDeviceOpenAttributes.Promiscuous, 1000))
{
using (PacketCommunicator outputCommunicator = selectedOutputDevice.Open(100, PacketDeviceOpenAttributes.Promiscuous, 1000))
{
// Allocate a send buffer
using (PacketSendBuffer sendBuffer = new PacketSendBuffer((uint)capLength))
{
// Fill the buffer with the packets from the file
Packet packet;
while (inputCommunicator.ReceivePacket(out packet) == PacketCommunicatorReceiveResult.Ok)
{
//outputCommunicator.SendPacket(packet);
sendBuffer.Enqueue(packet);
}
// Transmit the queue
outputCommunicator.Transmit(sendBuffer, isSync);
inputCommunicator.Dispose();
}
outputCommunicator.Dispose();
}
//inputCommunicator.Dispose();
}
}
}
为了发送数据包Pcap.Net
提供了2种方式:
发送缓冲区。
使用
SendPacket()
发送每个数据包。
现在完成发送我的 2 个文件后(就像在我的示例中)我想使用 Dispose()
来释放资源。
当使用第一个选项时一切正常,这完成处理我的 2 Pcap
个文件。
当使用第二个选项 SendPacket()
时(目前在我的代码示例中,这是作为注释)在第一个文件完成后我的应用程序将关闭并且不会到达第二个文件。
我也在 Console Application
和 WPF
中尝试过,在这两种情况下结果相同。
使用 UI
(WPF) 我的应用程序 GUI
没有任何错误就关闭了。
任何可能导致此问题的建议?
当您使用 using
关键字时,这意味着您在范围的末尾隐式调用 Dispose()
。
如果您也显式调用 Dispose()
,则意味着您在同一个实例上调用了两次 Dispose()
,这很可能会使您的程序崩溃。