Захват пакетов icmp в pcap.net

Я экспериментирую с pcap.net и хотел реализовать что-то, что отвечает на эхо-запросы в качестве упражнения. Операционная система уже на них реагирует, но я нормально генерирую дубликаты. Первый шаг, очевидно, даже знать, что пришел пакет 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);

        }
    }

person Joe Huha    schedule 07.07.2014    source источник


Ответы (1)


Видимо, я хотел написать следующее. Он надежно получает как входящие, так и исходящие эхо-запросы icmp. Я понятия не имею, почему я также не вижу массы 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);
    }
person Joe Huha    schedule 07.07.2014