2010-11-24 2 views
1

현재 C# 용 pcap 라이브러리를 사용하고 있으며 IP 헤더와 TCP/UDP/ECT 헤더를 제거하는 함수가 내장되어 있는지 궁금합니다. 그렇지 않다면, 누군가 그러한 헤더를 제거하는 방법을 게시 할 수 있습니까?C# 용 Pcap을 사용한 패킷 로깅

답변

2

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); 
} 

내가 한 곳에서보고있는 코드는 아마도 거의 1 년 전 이었지만, 정확히 내가하고있는 것에 대해 약간 흐릿한 것이 었습니다. 내가 게시 한 this question에서 볼 수있는 것처럼 일부 http 패킷 재구성 작업을 수행하고있었습니다. 사실, 그 실을보고, 내가 이것을하고 있었을 때 1 년이 넘었습니다!

1

저는 Carp의 pcap wrapper/library 인 SharpPcap의 저자입니다.

SharpPcap을 사용하는 경우 SharpPcap은 패킷을 데이터 그램으로 나눕니다. 그래서 당신은 UdpPacket을 포함하고있는 IpPacket을 포함하고있는 EthernetPacket으로 끝날 것입니다. 그냥 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() 패킷을 찾고 데이터 그램을 통과합니다. 구문 분석되는 모든 유형에 대해 동일한 접근 방식이 적용됩니다.