Frage

Ich habe versucht, ein Skript zu schreiben, die HTTP-Header schnuppern wird. Bisher habe ich die Fassung zu Port gebunden bekam 80 und Pakete scheinen empfangen zu werden, aber ich kann sie nicht in String-Form bekommen. Alles, was gibt ist „E“ kontinuierlich. Ich habe das Bytes in Hex früher und es scheint einige Daten kommen in werden, aber der aktuellen Code ist nicht in der Lage, das Bytes in eine Zeichenfolge zu ändern. Gibt es eine andere Möglichkeit, das Bytes der Decodierung, die eine richtige Zeichenfolge geben werden?

byte[] input = BitConverter.GetBytes(1);
byte[] buffer = new byte[4096];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
s.Bind(new IPEndPoint(IPAddress.Parse(strIP), 80));
s.IOControl(IOControlCode.ReceiveAll, input, null);
int bytes;
bytes = s.Receive(buffer);
while (bytes > 0)
{
    log(System.Text.Encoding.ASCII.GetString(buffer, 0, bytes));
    bytes = s.Receive(buffer);
}
War es hilfreich?

Lösung

Wenn Sie schnüffeln Daten mit Hilfe der raw Sockel, sind Sie Internet Protocol (IP) Pakete zu empfangen. Jedes IP-Paket beginnt mit einem IP-Header . Dieser Header ist in der Regel 20 Bytes lang, aber es kann als länger sein. Im Anschluss an den IP-Header wird der Header für den Transport Layer, zum Beispiel der Transmission Control Protocol (TCP) Kopf- oder User Datagram Protocol (UDP) Header. Nach diesem Header kommt die Daten, die Sie suchen, das heißt die HTTP. Also, wenn Sie die Daten sind Parsen, müssen Sie über die IP-Header überspringen und den Transport Layer-Header zuerst.

Andere Tipps

Sie mögen vielleicht den Quellcode für diesen C # Netzwerk-Sniffer zur Kasse, hier .

Erstens: Warum schreiben Sie dies mit Raw-Sockets und die IOControl verändern? Ich habe versucht, den Code auf Vista laufen und es würde nicht funktionieren, auch als Administrator an. Können Sie sich einen höheren Abstraktionsebene, wie TcpClient verwenden stattdessen?

Zweitens müssen Sie eine Anfrage senden, bevor Sie eine Antwort erhalten. Die einfachste Anfrage Sie senden können, ist „GET / \ n“, wobei \ n ist das Zeichen für eine neue Zeile.

Hier ist ein Code, den Sie (die Write-Methode zu überprüfen, muss der Rückgabewert auch, aber dies ist der Einfachheit halber weggelassen) verwenden:

        using (TcpClient tcpClient = new TcpClient(strIP, 80))
        {
            using (Stream s = tcpClient.GetStream())
            {
                byte[] bytesToSend = Encoding.ASCII.GetBytes("GET /\n");
                s.Write(bytesToSend, 0, bytesToSend.Length);
                int bytes;
                byte[] buffer = new byte[4096];
                do
                {
                    bytes = s.Read(buffer, 0, buffer.Length);
                    Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes));
                } while (bytes > 0);
            }
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top