Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.11.2013, 16:01
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию Помогите с обработкой принятых данных (UDP socket)

Здравствуйте господа!
Есть игра, которая запрашивает список игровых серверов с главного сервера, она называет его 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  
Старый 11.11.2013, 17:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, на пераый взгляд ответ похож на то, что в документации написано. Просто он в бинарном формате, т.е. так, как его хранит компьюьер. Тебе надо "засунуть" ответ в, напимер, TMemoryStream и вычитывать от туда как byte, integer и т.п.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Shaft (11.11.2013)
  #3  
Старый 11.11.2013, 20:15
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
Вопрос

Спасибо! Пол проблемы решено!
Пробую ответ принимать вот так(Часть кода)

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  
Старый 11.11.2013, 21:27
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Почитай про битовую арифметику.
Да и 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  
Старый 11.11.2013, 22:39
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Ставлю Спасибо вам господа! Проблема решена полностью!
Тему можно закрывать.
Ответить с цитированием
  #6  
Старый 12.11.2013, 06:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от PhoeniX
В частном случае:
105 * 256 (сдвиг на 8 бит влево) + 135 = 27015
105 * 256 + 145 = 27025

А просто WORD вычитать нельзя???
Ответить с цитированием
  #7  
Старый 12.11.2013, 09:17
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

А что еще проще можно? у меня и так работает.

делаю вот так:
Код:
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  
Старый 12.11.2013, 13:21
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
А просто WORD вычитать нельзя???
Нельзя. Судя по доке, они хорошенько обкурились и додумались запихнуть туда порт в формате Big-Edian (как, собственно, и IP). Наверное, чтобы жизнь медом не казалась.
Если вычитывать WORD, то придется делать еще bswap.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
PhoeniX (12.11.2013)
  #9  
Старый 12.11.2013, 14:20
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Bargest
порт в формате Big-Edian
Indian, я бы сказал

Цитата:
Сообщение от Shaft
Код:
a:=inttostr(e.IP11);
b:=inttostr(e.IP12);
ServerPort:=strtoint(a)*256+strtoint(b);
Зачем 2 преобразования - в строку и обратно? Делайте проще:
Код:
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  
Старый 12.11.2013, 14:54
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Действительно зачем) что то ночью мозг не работал видимо)
Спасибо! Исправил.
Ответить с цитированием
  #11  
Старый 12.11.2013, 21:28
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Господа возникла еще одна проблема!
Что бы получить порт мне советовали
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  
Старый 12.11.2013, 23:29
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Shaft
Собственно вопрос:
Как зная порт получить эти 2 числа чтобы они потом могли собраться по схеме
Число1 * 256 + Число2 = Порт
Например если порт 60239 как получить
235
79
Код:
Число1 := Порт div 256; // или Число1 := Порт shr 8;
Число2 := Порт mod 256; // или Число2 := Порт and $FF; или Число2 := Byte(Порт);
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Shaft (12.11.2013)
  #13  
Старый 12.11.2013, 23:44
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Спасибо большое!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:42.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025