![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте господа!
Есть игра, которая запрашивает список игровых серверов с главного сервера, она называет его Master server. Нужно с имитировать запрос на этот Master server и запросить у него эти данные. Запрос я вроде как составил, отправляю его и мне приходит что то не понятное: яяяf_Уi‡YС|Li‰O?¬§i?>Њъ…iЊФ¤Сi‡ Когда моя программа отправляет запрос то консоль этого Master Server'а пишет: HL Master Server - Processing get Rated Game servers list request from (мой IP) <<<< UDP Socket (132) sent 42 bytes datagram to (Мой IP) 00000000 : ff ff ff ff 66 0a 5f 1f d3 15 69 87 59 d1 7c 4c 00000010 : 69 89 4f 88 ac a7 69 88 3e 8c fa 85 69 8c d4 a4 00000020 : d1 11 69 87 00 00 00 00 00 Когда запрос отправляет игра то консоль этого Master Server'а пишет то же самое один в один, но игра как то понимает ответ. Подскажите пожалуйста как с помощью UDP socket обработать эту информацию. На сайте разработчика игры сказано что формат ответа мастер сервера такой: Reply format The reply always starts with FF FF FF FF 66 0A. The format is then a series of these server address blocks: Type Data Byte First octet of IP address Byte Second octet of IP address Byte Third octet of IP address Byte Fourth octet of IP address Unsigned Short Port number - usually 27015 (69 87) - this is network ordered, which is unlike every other Steam protocol. Ссылка на эту статью с доп.информацией: https://developer.valvesoftware.com/...Query_Protocol Заранее спасибо тем кто обратит внимание! |
#2
|
|||
|
|||
![]() Ну, на пераый взгляд ответ похож на то, что в документации написано. Просто он в бинарном формате, т.е. так, как его хранит компьюьер. Тебе надо "засунуть" ответ в, напимер, TMemoryStream и вычитывать от туда как byte, integer и т.п.
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Shaft (11.11.2013)
|
#3
|
|||
|
|||
![]() Спасибо! Пол проблемы решено!
Пробую ответ принимать вот так(Часть кода) type TRecieveIP = packed record IP1: Byte; IP2: Byte; IP3: Byte; IP4: Byte; IP5: Byte; IP6: Byte; IP7: Byte; IP8: Byte; IP9: Byte; IP10: Byte; IP11: Byte; IP12: Byte; IP13: Byte; IP14: Byte; IP15: Byte; IP16: Byte; end; в процедуре объявляю: var e:TRecieveIP; принимаю: udpsckt1.ReceiveBuf(e,SizeOf(e)); Обрабатываю и вывожу: mmo1.Lines.Add(inttostr(e.IP1)); mmo1.Lines.Add(inttostr(e.IP2)); mmo1.Lines.Add(inttostr(e.IP3)); mmo1.Lines.Add(inttostr(e.IP4)); mmo1.Lines.Add(inttostr(e.IP5)); mmo1.Lines.Add(inttostr(e.IP6)); mmo1.Lines.Add(inttostr(e.IP7)); mmo1.Lines.Add(inttostr(e.IP8)); mmo1.Lines.Add(inttostr(e.IP9)); mmo1.Lines.Add(inttostr(e.IP10)); mmo1.Lines.Add(inttostr(e.IP11)); mmo1.Lines.Add(inttostr(e.IP12)); mmo1.Lines.Add(inttostr(e.IP13)); mmo1.Lines.Add(inttostr(e.IP14)); mmo1.Lines.Add(inttostr(e.IP15)); mmo1.Lines.Add(inttostr(e.IP16)); В мастер сервер был добавлен всего один сервер с IP 95.31.211.21:27015(не реклама) ответ пришел такой: 255 255 255 255 102 10 95 31 211 21 105 135 0 0 0 0 как видно что если сложить строки 7,8,9,10 то получим Ip но без порта. Добавил в мастер сервер какой то другой сервер специально с другим портом 91.211.118.9:27025(не реклама) Ответ пришел такой: 255 255 255 255 102 10 91 211 118 9 105 145 0 0 0 0 как видно что если опять сложить строки 7,8,9,10 то получим Ip но опять без порта. Порт у этого сервера другой и мы видим что строки 11 и 12 изменились. Значит они отвечают за порт. На сайте разработчика игры написано что IP приходят в виде byte а порты в неизвестном мне Unsigned Short, в описании написано: Unsigned Short - A signed integer type. C++ standards guarantee it is at least 16 bits, no longer than type integer and longer than type byte. Может порты надо не в byte записывать, не пойму. Собственно вопрос: Подскажите как извлечь порт? |
#4
|
||||
|
||||
![]() Почитай про битовую арифметику.
Да и unsigned short - вполне таки нормальное число. Unsigned - показатель того, что число хранится без знака. Short - показатель того, что число 16-битное. Один байт = 8 бит. В частном случае: 105 * 256 (сдвиг на 8 бит влево) + 135 = 27015 105 * 256 + 145 = 27025 ![]() Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 11.11.2013 в 21:30. |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Shaft (11.11.2013)
|
#5
|
|||
|
|||
![]() Ставлю Спасибо вам господа! Проблема решена полностью!
Тему можно закрывать. |
#6
|
|||
|
|||
![]() Цитата:
А просто WORD вычитать нельзя??? |
#7
|
|||
|
|||
![]() А что еще проще можно? у меня и так работает.
делаю вот так: Код:
ServerIP:=inttostr(e.IP7)+'.'+inttostr(e.IP8)+'.'+inttostr(e.IP9)+'.'+inttostr(e.IP10)+':'; a:=inttostr(e.IP11); b:=inttostr(e.IP12); ServerPort:=strtoint(a)*256+strtoint(b); mmo1.Lines.Add(ServerIP+inttostr(ServerPort)); Последний раз редактировалось lmikle, 13.11.2013 в 07:28. |
#8
|
||||
|
||||
![]() Цитата:
Если вычитывать WORD, то придется делать еще bswap. jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
PhoeniX (12.11.2013)
|
#9
|
||||
|
||||
![]() Цитата:
![]() Цитата:
Код:
ServerPort:=e.IP11*256+e.IP12; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 12.11.2013 в 14:25. |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Shaft (12.11.2013)
|
#10
|
|||
|
|||
![]() Действительно зачем) что то ночью мозг не работал видимо)
Спасибо! Исправил. |
#11
|
|||
|
|||
![]() Господа возникла еще одна проблема!
Что бы получить порт мне советовали 105 * 256 (сдвиг на 8 бит влево) + 135 = 27015 105 * 256 + 145 = 27025 Я думал что первое число 105 всегда одинаковое и пытался разобрать порт обратно с помощью: Первое число 105 объявлял фиксированное а второе получал: q.IP12:=StrToInt(Ports)-26880; Все работало но позже выяснилось что первое число может меняться. Мне приходили порты и 235 79 и много разных. Собираются они по вашему совету Число1 * 256 + Число2 = Порт Всегда правильно(по крайней мере в 100 серверах с разными портами они собрались нормально. Собственно вопрос: Как зная порт получить эти 2 числа чтобы они потом могли собраться по схеме Число1 * 256 + Число2 = Порт Например если порт 60239 как получить 235 79 |
#12
|
||||
|
||||
![]() Цитата:
Код:
Число1 := Порт div 256; // или Число1 := Порт shr 8; Число2 := Порт mod 256; // или Число2 := Порт and $FF; или Число2 := Byte(Порт); |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Shaft (12.11.2013)
|
#13
|
|||
|
|||
![]() Спасибо большое!
|