Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.048 c
2-1184067049
AZIZE
2007-07-10 15:30
2007.08.05
Как програмно определить


15-1183841855
Vlad Oshin
2007-07-08 00:57
2007.08.05
что-то раньше не замечал. а действительно. Платят за таку ерунду


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


2-1183643293
vir
2007-07-05 17:48
2007.08.05
форма поверх


6-1163591742
hero
2006-11-15 14:55
2007.08.05
Как узнать какой процесс использует в данный момент такой-то порт





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский