Проблемы с C # SharpPcap - PullRequest
       32

Проблемы с C # SharpPcap

2 голосов
/ 04 января 2011

Мне было очень интересно использовать SharpPcap , но до сих пор это не шло хорошо.

Основная проблема заключается в следующем коде:

   private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
   {
        if(packet is TCPPacket)
        {                
            DateTime time = packet.Timeval.Date;
            int len = packet.PcapHeader.len;

            TCPPacket tcp = (TCPPacket)packet;
            string srcIp = tcp.SourceAddress;
            string dstIp = tcp.DestinationAddress;
            int srcPort = tcp.SourcePort;
            int dstPort = tcp.DestinationPort;

            Console.WriteLine("{0}:{1}:{2},
                {3} Len={4} {5}:{6} -> {7}:{8}", 
                time.Hour, time.Minute, time.Second, 
                time.Millisecond, len, srcIp, srcPort, 
                dstIp, dstPort);
        }
    }

"Не удалось найти тип или пространство имен TCPPacket"

ОК, поэтому японял, что это должен быть TcpPacket?но тогда возникла ошибка:

"Данное выражение никогда не относится к указанному типу ('PacketDotNet.TcpPacket')"

Игнорирование этого:

"SharpPcap.CaptureEventArgs" не содержит определения для Timeval, и не найден метод расширения "Timeval", принимающий первый аргумент типа "SharpPcap.CaptureEventArgs" "

И так далее, и так далее.Итак, мой вопрос: я что-то упустил?

У меня есть библиотеки PacketDotNet и SharpPcap, и я добавил оба оператора using.

Решение: Packet pack = Packet.ParsePacket (packet.Packet);TcpPacket tcpPacket = TcpPacket.GetEncapsulated (pack);

    DateTime time = packet.Packet.Timeval.Date;
    int len = packet.Packet.Data.Length;

    if (tcpPacket != null)
    {
        IpPacket ipPacket = (IpPacket)tcpPacket.ParentPacket;


            IPAddress srcIp = ipPacket.SourceAddress;
            IPAddress dstIp = ipPacket.DestinationAddress;
            ushort srcPort = tcpPacket.SourcePort;
            ushort dstPort = tcpPacket.DestinationPort;

            MessageBox.Show(String.Format("{0}:{1}:{2},{3} Len={4} {5}:{6} -> {7}:{8}",
                                time.Hour, time.Minute, time.Second, time.Millisecond, len,
                                srcIp, srcPort, dstIp, dstPort)
                );
    }

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Решение:

Packet pack = Packet.ParsePacket(packet.Packet);
TcpPacket tcpPacket = TcpPacket.GetEncapsulated(pack);

DateTime time = packet.Packet.Timeval.Date;
int len = packet.Packet.Data.Length;

if (tcpPacket != null)
{
    IpPacket ipPacket = (IpPacket)tcpPacket.ParentPacket;


        IPAddress srcIp = ipPacket.SourceAddress;
        IPAddress dstIp = ipPacket.DestinationAddress;
        ushort srcPort = tcpPacket.SourcePort;
        ushort dstPort = tcpPacket.DestinationPort;

        MessageBox.Show(String.Format("{0}:{1}:{2},{3} Len={4} {5}:{6} -> {7}:{8}",
                            time.Hour, time.Minute, time.Second, time.Millisecond, len,
                            srcIp, srcPort, dstIp, dstPort)
            );
}
2 голосов
/ 04 января 2011

Глядя на первую часть кода ...

private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
   {
        if(packet is TCPPacket)
        {    

пакет, похоже, имеет тип CaptureEventArgs, а не TCPPacket. Вероятно, есть какое-то свойство аргументов события, которое является вашим реальным пакетом. Если это правильно, то

"SharpPcap.CaptureEventArgs" не содержат определение для «Timeval» и нет метода расширения "Timeval" принимая первый аргумент типа SharpPcap.CaptureEventArgs может быть нашел "

Вероятно, верно по этой причине; CaptureEventArgs и Packet - это не одно и то же.

EDIT:

Я бы попробовал что-то вроде:

private static void device_OnPacketArrival(object sender, CaptureEventArgs packet)
   {
        if(packet.packet is TCPPacket)
        {               
            TCPPacket tcpPack = (TCPPacket)(packet.packet);
            DateTime time = tcpPack.Timeval.Date;
            int len = tcpPack.PcapHeader.len;           
            string srcIp = tcpPack.SourceAddress;
            string dstIp = tcpPack.DestinationAddress;
            int srcPort = tcpPack.SourcePort;
            int dstPort = tcpPack.DestinationPort;

            Console.WriteLine("{0}:{1}:{2},
                {3} Len={4} {5}:{6} -> {7}:{8}", 
                time.Hour, time.Minute, time.Second, 
                time.Millisecond, len, srcIp, srcPort, 
                dstIp, dstPort);
        }
    }
...