Pcap.Net PacketCommunicator.Dispose()关闭我的应用程序,没有任何错误

时间:2015-08-11 07:06:12

标签: c# pcap.net

我正在使用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提供两种方式:

  1. 发送缓冲区。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

如果您也明确地致电Dispose(),则表示您在同一个实例上拨打Dispose()两次,这可能会导致您的计划崩溃。