Pcap.处置()关闭我的应用程序没有任何错误

本文关键字:应用程序 任何 错误 我的 处置 Pcap | 更新日期: 2023-09-27 18:07:20

我使用Pcap.Net获取Pcap文件并通过我的机器Network Adapter传输所有它的数据包。因此,为了做到这一点,我使用的代码示例发送数据包使用发送缓冲区:

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提供了两种方式:

  1. 发送缓冲区。

  2. 使用SendPacket()发送每个数据包

现在完成后发送我的2个文件(如在我的例子中),我想使用Dispose()来释放资源。

当使用第一个选项时,所有工作都很好,这完成了处理我的2个Pcap文件。

当使用第二个选项SendPacket()(目前在我的代码示例中,这是作为一个注释)第一个文件完成后,我的应用程序正在关闭,而不是到达第二个文件。我也尝试在Console ApplicationWPF和在两种情况下相同的结果。使用UI (WPF)我的应用程序GUI只是关闭没有任何错误。

有什么建议吗?

Pcap.处置()关闭我的应用程序没有任何错误

当您使用using关键字时,这意味着您在作用域的末尾隐式地调用Dispose()

如果您显式地调用Dispose(),这意味着您在同一个实例上两次调用Dispose(),这很可能导致程序崩溃。