Мониторинг сервера CSS

Для тех, кто хочет сделать мир лучше.
Ответить
Сообщение
Автор
Griefff
Нович0к
Нович0к
Сообщения: 5
Зарегистрирован: 24.12.2010

#1 Сообщение 07.01.2011, 02:16

Здравствуйте! Пробую сделать мониторинг сервера ксс в delphi. Посылаю запрос через UDP на сервер так:

Код: Выделить всё

  IdUDPClient1.Active:= True;
  IdUDPClient1.Send(char(255)+char(255)+char(255)+char(255)+'TSource Engine Query'+Chr(0));
  s:=(IdUDPClient1.ReceiveString(1000));
  IdUDPClient1.Active:=False;
Сервер благополучно отвечает, но после преобразования полученных данных в строку (3 строка в коде) она содержит только название сервера и ничего больше, хотя сервер отправляет много чего! Как я понял перелопатив весь гугл по этой теме это происходит из-за того, что информация отправляемая сервером разделяется "нулевым байтом" (к примеру, в получаемых данных содержится: название сервера, потом нулевой байт, потом кол-во слотов, нулевой байт, карта, нулевой байт и т.д), а в delphi нулевой байт означает конец строки и получается, что при преобразовании полученных данных в строку, она (строка) обрывается на том месте где встречается первый нулевой байт.

Как этого избежать? Как удалить нулевые байты из полученных данных или заменить чем-то более дружелюбным? Может можно получить данные в hex-е, оттуда удалить нулевые байты... Может я вообще в корне не прав и нет там никаких нулевых байтов??! Помогите хоть чем-нибудь, уже не знаю что делать..

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#2 Сообщение 07.01.2011, 13:23

ReceiveString(1000) что за 1000? И почему оно в скобках (сам вызов метода)?

Добавлено спустя 1 час 10 минут 31 секунду:
И кстати данные можно читать не только в строку, но и, скажем, в массив из Byte'ов или Char'ов (если там действительно проблема с нуль-байтами...) хотя если 1000 - это количество байт для чтения...

Griefff
Нович0к
Нович0к
Сообщения: 5
Зарегистрирован: 24.12.2010

#3 Сообщение 07.01.2011, 18:31

в скобках указан таймаут в миллисекундах, читать данные кроме стринга можно только в буфер, имеющий тип TStream, а вот как по нему пробежаться, отыскать нулевые байты и удалить я не знаю. Кроме как в string и stream данные через данный метод получить ни во что нельзя. Подскажите чтоль как из stream вытянуть нулевые байты, как с ним вообще работать? или какй-то другой метод, выгодно было бы получить данные в hex-е, но как ??

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#4 Сообщение 07.01.2011, 19:53

Используй StringStream или MemoryStream... была-бы дельфя под рукой с бы сказал точнее как это всё применять...Кажется у какого-то из них (или даже у обоих?) есть DataString для получения строки целиком, а также можно пользоваться стандартными методами для Stream'ов - кароче проявление фантазии приветствуется... Можно ещё FileStream использовать для того чтобы понять что у тебя всё-таки грузится (потом открываеш файл в WinHEX и смотриш что внутри....)

Griefff
Нович0к
Нович0к
Сообщения: 5
Зарегистрирован: 24.12.2010

#5 Сообщение 07.01.2011, 20:32

MOZGIII
Спасибо большое!
Если кому не трудно, покажите пожалуйста пример работы со stream, как по нему пробежаться и удалить определённые данные оттуда, ну или что-то вроде этого.

Ответить