SharpPcap — проблема с захватом пакетов для извлечения информации из пакета.

Я использую SharpPcap для захвата пакетов.

Я пытаюсь получить значение класса трафика и использую udp.ipv6.TrafficClass.ToString().

проблема в том, что я получаю это исключение:

В экземпляре объекта не задана ссылка на объект.

private void packetCapturingThreadMethod()
{

   Packet packet = null;

   while ((packet = device.GetNextPacket()) != null)
   {
        packet = device.GetNextPacket();

        if (packet is UDPPacket)
        {
            UDPPacket udp = (UDPPacket)packet;

            MessageBox.Show(udp.ipv6.TrafficClass.ToString());
        }
   }
}

person Eyla    schedule 21.04.2010    source источник
comment
Кстати, это не ошибка; это исключение.   -  person John Saunders    schedule 21.04.2010
comment
Спасибо, что упомянули об этом :)   -  person Eyla    schedule 22.04.2010


Ответы (2)


Это исключение означает, что udp, udp.ipv6 или udp.ipv6.TrafficClass равно нулю. Вам необходимо проверить:

if (udp != null && udp.ipv6 != null && udp.ipv6.TrafficClass != null)
{
    MessageBox.Show(udp.ipv6.TrafficClass.ToString();
}
person John Saunders    schedule 21.04.2010
comment
Хороший ответ. Если SharpPcap не может что-то разобрать, он автоматически возвращает null. Например, если вы захватите TCP-пакет и попытаетесь проанализировать его как UDP, вы получите нулевой результат. Убедитесь, что ваши фильтры настроены правильно, затем проверьте захваченные пакеты на нуль, прежде чем анализировать полезную нагрузку/заголовок/поля, чтобы избежать каких-либо исключений. - person Evan Plaice; 10.11.2010

Я думаю, что здесь происходит то, что вы на самом деле проверяете только каждый второй пакет.

Вам не нужен второй packet = device.GetNextPacket();, потому что packet уже назначен в начале вашего цикла while.

Попробуйте это и посмотрите, получите ли вы все еще исключение:

private void packetCapturingThreadMethod()
{

   Packet packet = null;

   while ((packet = device.GetNextPacket()) != null)
   {
        if (packet is UDPPacket)
        {
            UDPPacket udp = (UDPPacket)packet;

            MessageBox.Show(udp.ipv6.TrafficClass.ToString());
        }
   }
}


Если вы по-прежнему получаете исключение, это, скорее всего, связано с тем, что вы не получаете действительный пакет ipv6.

person Ad Hoc    schedule 21.04.2010