Регистрация пакетов с помощью Pcap для C # - PullRequest
1 голос
/ 24 ноября 2010

В настоящее время я использую библиотеку pcap для C #, и мне было интересно, есть ли какие-либо встроенные функции для удаления заголовков IP и заголовков TCP / UDP / ECT? Если нет, может кто-нибудь опубликовать, как они добились удаления таких заголовков?

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Используете ли вы PacketXLib ? Я использовал это раньше и нашел, что это достаточно просто для написания кода. Извлечь заголовки достаточно просто, просто зная основные принципы протоколов

public const int ETHERNETLEN = 14;    // length of ethernet header
public const int IPLEN = 20;          // length of ip header
public const int TCPLEN = 20;         // length of tcp header

Предполагая, что вы используете ту же библиотеку, что и я, вы можете просто обойти заголовки, чтобы получить необработанные данные

int dataOffset = ETHERNETLEN + IPLEN + TCPLEN;
string rawData = "";
// Throw all the data into a string first up so we can work with it easier
for (int i = dataOffset; i < aPacket.DataSize; i++)
{
  byte nByte = (byte)aPacket.DataArray.GetValue(i);
  rawData += Convert.ToChar(nByte);
}

Код, который я смотрю, где я сделал это, вероятно, почти год, так что немного смутно от того, что именно я делал. Я выполнял некоторую реконструкцию http-пакета, как видно из этого вопроса , который я опубликовал. На самом деле, глядя на эту ветку, это было более года назад, когда я делал это!

1 голос
/ 31 января 2012

Я являюсь автором SharpPcap, оболочки / библиотеки pcap для c #.

Если вы использовали SharpPcap, SharpPcap разбивает пакет на дейтаграммы.Таким образом, вы получите EthernetPacket, который содержит IpPacket, который содержит, скажем, UdpPacket.Если вам нужен только пакет udp, вы можете легко извлечь его, например:

Packet p = Packet.ParsePacket(rawCapture.LinkLayerType, rawCapture.Data);
var udpPacket = UdpPacket.GetEncapsulated(p);
if(udpPacket != null) { Console.WriteLine("found udp packet '{0}'", udpPacket); }

UdpPacket.GetEncapsulated () обходит дейтаграммы в поисках пакета.Такой же подход работает для всех анализируемых типов.

...