2

我正在试验 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 地址并且似乎不是回显请求数据包)。

请问我做错了什么?

    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);

        }
    }
4

1 回答 1

2

显然,我本来打算写的是以下内容。它可靠地获取传入和传出的 icmp echo 请求。我不知道为什么当我被 rdesktop-ed 到运行它的计算机时,我也没有看到大量的 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);
    }
于 2014-07-07T23:47:20.133 回答