Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Писк игровых серверов.Оптравка пакетов. [D7, WinXP]


XfroSt ©   (2006-12-07 20:06:00) 

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

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


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

Как видно из скиншота пакет длинной 13 байт и его содержание : 'Ãâ.=÷*


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

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


arefart   (2006-12-26 20:44:00) [2]

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


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

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


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

мда... в отладчике сморю при приеме идет конец строки после команд типа так ('ÿ', 'ÿ', 'ÿ', 'ÿ', '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, 'ð', #0, #1, ' ', #0, 'l', 'w', #0, #0, '1', '.', '0', '.', '0', '.', '2', '8', #0, и т.д... нули...
а можно как нибуть снять в Listitem.SubItems.Add(chb); все символы, что бы потом можно было отредактировать ? или просто поменять символ конца строки на другой ?


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

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

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


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

С отправкой разобрался, а вот с приемом...
Такая проблема, использую компонент 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приходит только yyyyI\x7Sancho
пробовал увеличивать размер буфера udpserverне помогает!
причем отладчим смотрю что chbне заполнена полностью тока начало дальше нули.

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо