Вопрос

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

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);
}
Это было полезно?

Решение

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

Другие советы

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

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

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

Вот некоторый код, который вы могли бы использовать (метод 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);
            }
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top