Форум: "Сети";
Текущий архив: 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 байт и его содержание : "Ãâ.=÷*<"
в ответ сервер присылает другой пакет с инфой :
все вроде ясно.
кидаю на форму дельфи компонент.
IdUDPServer1
кнопу и мемо
в кнопке пишу следующие
IdUDPServer1.DefaultPort := 8889;
IdUDPServer1.Active := true;
IdUDPServer1.Send("192.168.0.255",8889,"Ãâ.=÷*<");
в обработчике 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]мда... в отладчике сморю при приеме идет конец строки после команд типа так ("ÿ", "ÿ", "ÿ", "ÿ", "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); все символы, что бы потом можно было отредактировать ? или просто поменять символ конца строки на другой ?
← →
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.04 c