1

我正在使用Pcap.Nettake PcapFile 并通过我的机器传输它的所有数据包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提供了 2 种方式:

  1. 发送缓冲区。

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

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

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

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

有什么建议可能导致这种情况吗?

4

1 回答 1

0

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

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

于 2015-08-15T06:14:06.163 回答