Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.05;
Скачать: CL | DM;

Вниз

Писк игровых серверов.Оптравка пакетов.   Найти похожие ветки 

 
XfroSt   (2006-12-07 20:06) [0]

Доброе время суток!

извиняюсь но это сообщене со скрин шотами можно посмореть тут: http://forum.sources.ru/index.php?showtopic=164045


Решил написать программу для поиска игровых серверов. Я понимаю что таких тем в форумах скопилось много, но меня интересуют конкретные вопросы. Кто разбирается в UDP и снифферах прошу помоч и ответить. Мне надо "зацепиться" за технологию определния.
Итак.
что я делаю.
1. Прошу запустить человека игровой сервер в локалке.
2. Включаю сниффер (предварительно определив какие порты использует игра через НетВью к примеру, в данном примере используется порт 8889 на прием и передачу)
3. Запускаю у себя клиент игры
переключаюсь в сниффер и вижу, что с меня уходит широковещательных пакет.

Как видно из скиншота пакет длинной 13 байт и его содержание : "&#195;&#226;.=&#247;*<"
в ответ сервер присылает другой пакет с инфой :

все вроде ясно.
кидаю на форму дельфи компонент.
IdUDPServer1
кнопу и мемо
в кнопке пишу следующие
IdUDPServer1.DefaultPort := 8889;
IdUDPServer1.Active := true;
IdUDPServer1.Send("192.168.0.255",8889,"&#195;&#226;.=&#247;*<");

в обработчике IdUDPServer1UDPRead
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
 ABinding: TIdSocketHandle);
var
 S: TStringStream;
 Reply: String;
begin
 S := TStringStream.Create("");
 try
   S.CopyFrom(AData, AData.Size);
   memo1.Clear;
   Memo1.Lines.Add(Format("Ответ сервера : %s", [S.DataString]));
 finally
   S.Free;
 end;
end;

далее выключаю свою клиентскую игру, что бы не было конфликтов сокетов UDP
запускаю программу дельфи
жму кнопку
В мемо приходит тока мой запроос : "Ответ сервера : : Aa.=?*<"
сниффер показывает следующие:

т.е. пакет другой длинны в 15 а не в 13 байт.
Вопросы!
1. Как правильно анализировать пакеты снифером что бы повторить их отправку в Дельфи ? Может использовать другой сниффер ?
2. Как можно просто повторить пакет в дельфи ? т.е. как можно в дельфи так же перехватить пакет, сохранить его и потом просто повторить ?
3. Правильно ли я работаю с компонентой IdUDPServer1 ? если пакет я отправлю верно, верно ил я читаю ответ ?
4. Правильный ли я вообще выбрал агоритм работы по отлову серверов игр ? Может есть лучше ?

Если кто занет прошу ответить и прояснить мне эту тему. Есть программы которые мониторят сервера игр, но они видят не все игры, не поддерживают плагины и проч... Я пишу многофукциональную прогу для сети и поиск игровых серверов одна из ее возможносетй -поэтому хотелось бы разобраться в теме как следует.

Заранее спасибо!


 
XfroSt   (2006-12-08 16:18) [1]

С отправкой разобрался, а вот с приемом...
Такая проблема, использую компонент TIdUDPServer
отсылаю им широковещательный запрос. в ответ приходит ответ.
читаю его так :

procedure TMF.udpserverUDPRead(Sender: TObject; AData: TStream;
 ABinding: TIdSocketHandle);
var
remhost  : String;
chb      : array[0..1024] of char;
remport,
Len      : integer;
ListItem  : TListItem ;
begin
     FillMemory(@chb[0],1024,0);
     RemHost := ABinding.PeerIP;
     RemPort := ABinding.PeerPort;
     Len:=AData.Read(chb,1024);
end;


но вот в чем проблема сниффепром вижу что пришел пакет размером Length: 0x0051 (81);
содержание пакета :
0x0000  00 16 17 B5 46 3E 00 13-D4 BE BC A7 08 00 45 00  ...µF>..O??§..E.
0x0010  00 65 73 EC 00 00 80 11-44 AD C0 A8 00 2F C0 A8  .esi..€.DA?./A?
0x0020  00 6F 69 87 69 87 00 51-F0 73 FF FF FF FF 49 07  .oi‡i‡.Q?syyyyI.
0x0030  53 61 6E 63 68 6F 00 63-73 5F 6D 61 6E 73 69 6F  Sancho.cs_mansio
0x0040  6E 00 63 73 74 72 69 6B-65 00 43 6F 75 6E 74 65  n.cstrike.Counte
0x0050  72 2D 53 74 72 69 6B 65-3A 20 53 6F 75 72 63 65  r-Strike: Source
0x0060  00 F0 00 01 11 00 6C 77-00 00 31 2E 30 2E 30 2E  .?....lw..1.0.0.
0x0070  32 38 00                                          28.

len показывает размер 71
а в chb приходит только yyyyISancho
пробовал увеличивать размер буфера udpserver не помогает!
причем отладчим смотрю что chb не заполнена полностью тока начало дальше нули.

Как получить остальное ?


 
Орион ©   (2006-12-08 16:46) [2]

> Как получить остальное ?

что ты дальше делаешь с chb? Что-то вроде Memo1.Lines.Text:=string(chb)?
У тебя там символ с кодом #0 встречается - конец строки.


 
XfroSt   (2006-12-08 18:24) [3]

мда... в отладчике сморю при приеме идет конец строки после команд типа так ("&#255;", "&#255;", "&#255;", "&#255;", "I", #7, "C", "S", "S", "o", "u", "r", "c", "e", #0, "d", "e", "_", "d", "u", "s", "t", "3", #0, "c", "s", "t", "r", "i", "k", "e", #0, "C", "o", "u", "n", "t", "e", "r", "-", "S", "t", "r", "i", "k", "e", ":", " ", "S", "o", "u", "r", "c", "e", #0, "&#240;", #0, #1, " ", #0, "l", "w", #0, #0, "1", ".", "0", ".", "0", ".", "2", "8", #0, и т.д... нули...
а можно как нибуть снять в Listitem.SubItems.Add(chb); все символы, что бы потом можно было отредактировать ? или просто поменять символ конца строки на другой ?


 
XfroSt   (2006-12-22 20:52) [4]

Все спасибо вопрос решен!


 
arefart ©   (2006-12-26 20:44) [5]

Можеш написать как решил проблему? Мне тоже интересно, у меня похожая ситуация.


 
XfroSt   (2006-12-28 02:50) [6]

2  arefart ©
Вот пример кода.
1. Читаю память в массив символов.
2. Можно просто убрать все символы строки #0, но я их заменяю.

Коряво но мне хватает, я перевожу для наглядности символы #0 в "#0"... но вариантов масса.

var
chbCL,chbSR      : array[0..1024,0..1024] of char;
begin
                   // расшифровываем данные
                   FillMemory(@chbCL[PakLV.Items.Count][0],1024,0);
                   RemPort := ABinding.PeerPort;
                   lenCl[PakLV.Items.Count]    :=AData.Read(chbCl[PakLV.Items.Count],1024);
                            // собираем строки
                   for i := 0 to lenCl[PakLV.Items.Count] do
                   if chbCL[PakLV.Items.Count][i] = #0 then
                     begin
                     s := s+"#0";
                     end
                     else
                   s := s+chbCL[PakLV.Items.Count][i];
                   with pakLV do
                       begin
                         ListItem := Items.Add;
                         Listitem.Caption := RemHost;
                         Listitem.SubItems.Add(IntToStr(RemPort));
                         Listitem.SubItems.Add("UDP");
                         Listitem.SubItems.Add(IntToStr(lenCl[PakLV.Items.Count-1]));
                         Listitem.SubItems.Add(s);
                       end;
           end



Страницы: 1 вся ветка

Текущий архив: 2007.08.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
3-1177351107
DmitrichJ
2007-04-23 21:58
2007.08.05
Автоинкреминируемое поле в STANDART PARADOX7


2-1183923865
nali
2007-07-08 23:44
2007.08.05
virtual или dynamic metods


15-1183565551
Илья Иванович
2007-07-04 20:12
2007.08.05
Визуализация экономического метода


15-1183705117
DelphiN!
2007-07-06 10:58
2007.08.05
Разрешить учетной записи пользователя устанавливать программы


2-1184055061
AZIZE
2007-07-10 12:11
2007.08.05
поддержка длииных имён файлов