SharpPcap - проблема с сообщением о захвате пакетов

Я пытаюсь захватить пакеты с помощью библиотеки SharpPcap. Я могу вернуть информацию о пакетах, но у меня проблема с получением содержимого сообщения внутри пакета.

пакет, использующий .Data для возврата сообщения, и когда я его использую, он возвращается (System.Byte[]).

вот сайт библиотеки: http://www.codeproject.com/KB/IP/sharppcap.aspx

вот мой код:

string packetData;
        private void packetCapturingThreadMethod()
            {

            Packet packet = null;
           int countOfPacketCaptures = 0;

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

                packet = device.GetNextPacket();
                if (packet is TCPPacket)
                    {
                    TCPPacket tcp = (TCPPacket)packet;
                    myPacket tempPacket = new myPacket();

                    tempPacket.packetType = "TCP";
                    tempPacket.sourceAddress = Convert.ToString(tcp.SourceAddress);
                    tempPacket.destinationAddress = Convert.ToString(tcp.DestinationAddress);
                    tempPacket.sourcePort = Convert.ToString(tcp.SourcePort);
                    tempPacket.destinationPort = Convert.ToString(tcp.DestinationPort);
                    tempPacket.packetMessage = Convert.ToString(tcp.Data);
                    packetsList.Add(tempPacket);

                     packetData = 
                        "Type= TCP" +
                        "   Source Address = "+  Convert.ToString(tcp.SourceAddress)+
                       "   Destination Address =" +Convert.ToString(tcp.DestinationAddress)+
                       "   SourcePort =" +    Convert.ToString(tcp.SourcePort)+
                       "   SourcePort =" +Convert.ToString(tcp.DestinationPort)+
                       "   Messeage =" + Convert.ToString(tcp.Data);
                    txtpackets.Invoke(new UpdatetxtpacketsCallback(this.Updatetxtpackets),
            new object[] { packetData });


                    string[] row = { packetsList[countOfPacketCaptures].packetType, packetsList[countOfPacketCaptures].sourceAddress, packetsList[countOfPacketCaptures].destinationAddress, packetsList[countOfPacketCaptures].sourcePort, packetsList[countOfPacketCaptures].destinationPort, packetsList[countOfPacketCaptures].packetMessage };
                    try { //dgwPacketInfo.Rows.Add(row); countOfPacketCaptures++;
                    //lblCapturesLabels.Text = Convert.ToString(countOfPacketCaptures);
                    }
                    catch (Exception e) { }

                    }
                else if (packet is UDPPacket)
                    {

                    UDPPacket udp = (UDPPacket)packet;


                    myPacket tempPacket = new myPacket();

                    tempPacket.packetType = "UDP";
                    tempPacket.sourceAddress = Convert.ToString(udp.SourceAddress);
                    tempPacket.destinationAddress = Convert.ToString(udp.DestinationAddress);
                    tempPacket.sourcePort = Convert.ToString(udp.SourcePort);
                    tempPacket.destinationPort = Convert.ToString(udp.DestinationPort);
                    tempPacket.packetMessage = udp.Data.ToArray() + "\n";
                    packetsList.Add(tempPacket);

                    packetData = 
                        "Type= UDP" +
                        "   Source Address = "+  Convert.ToString(udp.SourceAddress)+
                       "   Destination Address =" +Convert.ToString(udp.DestinationAddress)+
                       "   SourcePort =" +    Convert.ToString(udp.SourcePort)+
                       "   SourcePort =" +Convert.ToString(udp.DestinationPort)+
                       "   Messeage =" + udp.Data.ToArray() + "\n";
                    string[] row = { packetsList[countOfPacketCaptures].packetType, packetsList[countOfPacketCaptures].sourceAddress, packetsList[countOfPacketCaptures].destinationAddress, packetsList[countOfPacketCaptures].sourcePort, packetsList[countOfPacketCaptures].destinationPort, packetsList[countOfPacketCaptures].packetMessage };
                    try {
                        //dgwPacketInfo.Rows.Add(row);
                    //countOfPacketCaptures++;
                    //lblCapturesLabels.Text = Convert.ToString(countOfPacketCaptures);
                        txtpackets.Invoke(new UpdatetxtpacketsCallback(this.Updatetxtpackets),
               new object[] { packetData });

                    }
                    catch (Exception e) { }


                    }


                }
            }

person Eyla    schedule 24.03.2010    source источник


Ответы (2)


Я нашел ответ...

Данные представляют собой массив байтов, поэтому мне нужно использовать битовый преобразователь вместо использования:

Convert.ToString(tcp.Data);

Я должен использовать:

BitConverter.ToString(tcp.Data)
person Eyla    schedule 24.03.2010

Синтаксический анализатор не такой сложный...

Я просмотрел код Packet.Net (который является синтаксическим анализом для SharpPcap), и все поля хранятся в часто используемых форматах.

IP-адреса хранятся в формате System.Net.IPAddress, поэтому вы можете просто вызвать для них .ToString, чтобы получить текстовую строку, которая правильно включает точки.

Номера портов хранятся как ushort, которые можно распечатать так же, как и любое другое целое число.

Единственная часть, которую необходимо интерпретировать в двоичной форме, — это поле данных, поскольку оно изменяется в зависимости от того, какой протокол используется на следующем уровне. SharpPcap/Packet.Net уже делает большую часть работы за вас, а поля хранятся в наиболее удобной или идентичной форме, указанной в спецификации протокола. Просто используйте intellisense, чтобы проверить тип поля, и если вы не знакомы с ним (например, System.Net.IPAddress или System.NetworkInformation.PhysicalAddress (для MAC-адресов)) просто погуглите его.

person Evan Plaice    schedule 10.11.2010