在pcap.net中捕获icmp数据包

时间:2014-07-07 18:45:02

标签: pcap.net

我正在尝试使用pcap.net,并希望实现一些响应ping作为练习的东西。操作系统已对它们做出响应,但我可以生成重复项。第一步显然是知道ping数据包已经到达。我在https://pcapdotnet.codeplex.com/wikipage?title=Pcap.Net%20Tutorial%20-%20Opening%20an%20adapter%20and%20capturing%20the%20packets&referringTitle=Pcap.Net%20User%20Guide修改了示例以使用以下处理程序。

我显然不明白发生了什么,因为没有捕获的数据包甚至在正确的子网上。将ping数据包发送到目标IP没有任何区别,尽管使用ping -i 0会大量增加接收数据包的数量(但它们仍然没有合理的IP地址,并且似乎不是echo-r​​equest数据包)。

我做错了什么?

    private static void PacketHandler(Packet packet)
    {
        IpV4Address dst = packet.IpV4.Destination, src = packet.IpV4.Source;

        if (dst == null || src == null) return;            

        if (packet.IpV4.Icmp != null)
        {                
            Console.WriteLine(packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") + " length:" + packet.Length+" "+src+" -> "+dst);

        }
    }

1 个答案:

答案 0 :(得分:2)

显然,我打算写的是以下内容。它可靠地获取传入和传出的icmp echo请求。我不知道为什么我也不会看到大量的TCP数据包经过,因为我已经进入运行它的计算机。但它似乎对我想做的事情做得很好。

    private static void PacketHandler(Packet packet)
    {
        if (packet.DataLink.Kind != DataLinkKind.Ethernet) return;            
        EthernetDatagram ed = packet.Ethernet;

        if (ed.EtherType != EthernetType.IpV4) return;
        IpV4Datagram ipv4 = ed.IpV4;  

        if (ipv4.Protocol != IpV4Protocol.InternetControlMessageProtocol) return;
        IcmpDatagram icmp = ipv4.Icmp;

        IpV4Address dst = ipv4.Destination, src = ipv4.Source;

        Console.WriteLine(" length:" + packet.Length + " " + src + " -> " + dst + "   " + icmp);
    }