Pregunta

He estado tratando de escribir un script que olfatear las cabeceras HTTP. Hasta ahora tengo la toma enlazado al puerto 80 y los paquetes parecen ser recibida, pero no puedo conseguirlos en forma de cadena. Todo lo que da salida es "E" de forma continua. He cambiado la bytes en hexadecimal antes y parece que hay algunos datos que entran, pero el código actual no es capaz de cambiar los bytes en una cadena. ¿Hay alguna otra manera de decodificar los octetos que le dará una cadena adecuada?

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);
}
¿Fue útil?

Solución

Cuando huela datos utilizando un paquetes prima zócalo, que está recibiendo el Protocolo de Internet (IP). Cada paquete IP comienza con la cabecera IP . Esta cabecera es típicamente 20 bytes de longitud, pero puede ser más largo que eso. Después de la cabecera IP es el encabezado de la capa de transporte, por ejemplo, la href="http://en.wikipedia.org/wiki/Transmission_Control_Protocol" rel="noreferrer"> Protocolo de Control de Transmisión (TCP) cabecera o el Protocolo de datagramas de usuario (UDP) cabecea. Después de esta cabecera viene los datos que está buscando, es decir, el protocolo HTTP. Así que cuando el análisis de los datos, es necesario saltar más allá de la cabecera IP y la cabecera de capa de transporte en primer lugar.

Otros consejos

Es posible que desee descargar el código fuente de esta red sniffer C #, aquí .

En primer lugar, ¿por qué estás escribiendo esto usando los conectores directos y cambiar el IOControl? Intenté funcionar el código de Vista y que no funcionaría, incluso como administrador. Se puede utilizar un nivel más alto de abstracción, como TcpClient lugar?

En segundo lugar, es necesario enviar una solicitud antes de recibir una respuesta. La solicitud más sencillo que se puede enviar es "GET / \ n", donde \ n es el carácter de nueva línea.

Aquí hay un código que se puede utilizar (el método de escritura tiene que comprobar el valor devuelto también, pero esto se omite por razones de simplicidad):

        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);
            }
        }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top