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种方式:

  1. 发送缓冲区。

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

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

当使用第一个选项时一切正常,这完成处理我的 2 Pcap 个文件。

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

任何可能导致此问题的建议?

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

如果您也显式调用 Dispose(),则意味着您在同一个实例上调用了两次 Dispose(),这很可能会使您的程序崩溃。