pcap.net ReceivePacket 无法正常工作

Posted

技术标签:

【中文标题】pcap.net ReceivePacket 无法正常工作【英文标题】:pcap.net ReceivePacket doesn't work properly 【发布时间】:2019-10-07 01:35:42 【问题描述】:

    接收数据包。

    在我发送了一个数据包之后,我还想接收来自前一个数据包的目的地的数据包。

    我尝试使用 ReceivePacket,但总是得到 packet12 的空值。

    还有什么我需要做的吗?

    设置过滤器。

    我查了pcap.net的文档

    我假设参数(“ip and icmp”)与我们可以在wireshark中使用的过滤器相同。

    ip.src == 192.168.15.32 and icmp
    

    但是这个参数有错误。这和wireshark的过滤器有区别吗?


代码:

using (PacketCommunicator inputCommunicator =
            selectedInputDevice.Open(65536, // portion of the packet to capture
                                            // 65536 guarantees that the whole packet will be captured on all the link layers
                PacketDeviceOpenAttributes.Promiscuous, // promiscuous mode
                1000)) // read timeout
        
            using (PacketCommunicator outputCommunicator =
                selectedOutputDevice.Open(100, PacketDeviceOpenAttributes.Promiscuous, 1000))
            
                // Check the MAC type
                if (inputCommunicator.DataLink != outputCommunicator.DataLink)
                
                    Console.WriteLine("Warning: the datalink of the capture differs from the one of the selected interface.");
                    Console.WriteLine("Press a key to continue, or CTRL+C to stop.");
                    Console.ReadKey();
                

                // Allocate a send buffer
                using (PacketSendBuffer sendBuffer = new PacketSendBuffer((uint)capLength))
                
                    // Fill the buffer with the packets from the file

                    PcapDotNet.Packets.Packet tpacket;
                    while (inputCommunicator.ReceivePacket(out tpacket) ==
                           PacketCommunicatorReceiveResult.Ok)
                    
                        sendBuffer.Enqueue(tpacket);
                        ++numPackets;
                    

                    //                        bool isSync = true;

                    // Transmit the queue
                    Stopwatch stopwatch = new Stopwatch();
                    stopwatch.Start();
                    long startTimeMs = stopwatch.ElapsedMilliseconds;
                    Console.WriteLine("Start Time: " + DateTime.Now);

                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("Sending a pcap file is in progress. Wait until it is finished");
                    Console.ResetColor();

                    outputCommunicator.Transmit(sendBuffer, isSync);

                    long endTimeMs = stopwatch.ElapsedMilliseconds;
                    Console.WriteLine("End Time: " + DateTime.Now);
                    long elapsedTimeMs = endTimeMs - startTimeMs;
                    Console.WriteLine("Elapsed Time: " + elapsedTimeMs);

                    Console.WriteLine("Elapsed time: " + elapsedTimeMs + " ms");
                    Console.WriteLine("Total packets generated = " + numPackets);
                    //                        Console.WriteLine("Average packets per second = " + averagePacketsPerSecond);
                    Console.WriteLine("============================================================");

                
                inputCommunicator.SetFilter("ip and icmp");

                Console.WriteLine("Listening on " + selectedInputDevice.Description + "...");

                PcapDotNet.Packets.Packet packet12;

                inputCommunicator.ReceivePacket(out packet12);

               foreach (var options in packet12)
                    Console.WriteLine(options);

【问题讨论】:

【参考方案1】:

1.

在某一时刻,您似乎使用inputCommunicator

// 用文件中的数据包填充缓冲区

但在不同的地方,您使用相同的inputCommunicator 来获取从某个目的地发送的数据包。

您似乎需要使用两个不同的 Communicator 并使用不同的设备创建它们。

2.

如果遇到错误,请提供错误信息。

你从哪里得到ip.src 的语法?你试过src host吗?

【讨论】:

以上是关于pcap.net ReceivePacket 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

c#在pcap.net中提供包源

.net 数据包捕获:pcap.net 与 Sharppcap

如何将 Pcap.Net 数据包类对象导出到 .pcap 文件

Pcap .NET 库:找不到 PcapDotNet.Core.DLL

为啥使用 PCap.NET 发送的数据包没有填写 TCP 选项?

使用 Pcap.net 获取样本周期内流量最大的网络接口