C # Получение пакетных данных - PullRequest
4 голосов
/ 05 декабря 2009

Я пытался написать скрипт, который будет прослушивать HTTP-заголовки. Пока что у меня есть сокет, привязанный к порту 80, и кажется, что пакеты получены, но я не могу получить их в виде строки. Все, что выводит «Е» постоянно Ранее я изменил байты на шестнадцатеричные, и, похоже, поступают некоторые данные, но текущий код не может преобразовать байты в строку. Есть ли другой способ декодирования байтов, который даст правильную строку?

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

Ответы [ 3 ]

6 голосов
/ 05 декабря 2009

Когда вы прослушиваете данные, используя сокет raw , вы получаете пакеты Интернет-протокола (IP). Каждый IP-пакет начинается с IP-заголовка . Этот заголовок обычно имеет длину 20 байт, но он может быть длиннее. За заголовком IP следует заголовок для транспортного уровня, например, заголовок протокола управления передачей (TCP) или заголовок протокола дейтаграмм пользователя (UDP). После этого заголовка идут данные, которые вы ищете, то есть HTTP. Поэтому, когда вы анализируете данные, вам нужно сначала пропустить заголовок IP и заголовок транспортного уровня.

5 голосов
/ 05 декабря 2009

Во-первых, почему вы пишете это, используя необработанные сокеты и меняя IOControl? Я попытался запустить ваш код в Vista, и он не будет работать, даже как администратор. Можете ли вы использовать более высокий уровень абстракции, например, вместо TcpClient?

Во-вторых, вам нужно отправить запрос, прежде чем вы получите ответ. Самый простой запрос, который вы можете отправить, это «GET / \ n», где \ n - символ новой строки.

Вот некоторый код, который вы могли бы использовать (метод Write также должен проверять возвращаемое значение, но для простоты это опущено):

        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);
            }
        }
5 голосов
/ 05 декабря 2009

Возможно, вы захотите получить исходный код для этого сетевого анализатора C #, здесь .

...