2012-06-14 8 views
8

Chcę otrzymać nieprzetworzony pakiet TCP, a następnie wysłać go z tym samym obciążeniem.Jak uzyskać surowy pakiet TCP w języku C#?

To powinno wyglądać mniej więcej tak:

void OnPacketReceived(TcpPacket p) 
{ 
    byte [] body = p.GetBody(); 
} 

UWAGA: Muszę pakiet TCP, a nie ramki Ethernet.

+0

mogę być w 100% nie tak, ale nie jestem pewien, czy jest to możliwe do zrobienia z kodu zarządzanego. O ile mi wiadomo, biblioteka gniazd w C# używa wyłącznie strumieni, a tym samym oddziela granice pakietów. –

+0

well pozwala sprawdzić, czy ktoś mógł to złamać. –

+2

Czy obejrzałeś http://pcapdotnet.codeplex.com/ To jest wrapper .net wokół WinPcap. –

Odpowiedz

6

Jeśli zaimplementujesz gniazdo jako surowe gniazdo, masz dostęp do całego pakietu (i faktycznie musisz samemu zająć się wszystkim na temat pakietu).

Użyj SocketType.Raw i ProtocolType.Raw podczas tworzenia gniazda.

Pamiętaj, że będziesz musiał zająć się szczegółami protokołu TCP, jeśli w ten sposób zaimplementujesz gniazdo.

Dla porównania, tutaj jest dokumentacja MSDN o klasie Socket: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx

+0

+1: Użyłem tej metody, aby sprawdzić, czy nagłówek pakietu TCP ma sumę kontrolną, czy nie (ponieważ nie jest to obowiązkowe). –

+0

@AllonGuralnek mógłbyś udostępnić kod, proszę? a przynajmniej po to, by nakreślić, co należy zrobić, aby to osiągnąć? –

+0

@dodexahedron - czy jesteś w 100% pozytywny, że jeśli podłączysz gniazdo raw otrzymam dostęp do pakietu TCP prosto? (to jest właściwie pytanie). jeśli jesteś tego pewien, czy mógłbyś to potwierdzić i zaznaczyć go jako odpowiedź. Dziękuję Ci. –

0

trzeba użyć Packet Sniffer, gdzie można umieścić filtry do wyboru i na tej podstawie może odpowiedzieć również.

. Owijarka WinNet wokół WinPcap może okazać się pomocna.