Помогите Query UDP Protocol в Delphi

  • Автор темы Автор темы J1Mmy
  • Дата начала Дата начала

J1Mmy

Старожил
Пользователь
Баллы
103
Доброго времени суток! Дело такое:
Пытаюсь написать программу которая будет по UDP протоколу определять статус сервера. Документацию самого протокола можно взять здесь(не реклама!).
Моя попытка выглядит вот так:
Код:
type
  THandShake = array[0..6] of byte;
  TBasicStatus = array[0..14] of byte;
const
  HandShake: THandShake = ($FE, $FD, $09, $01, $02, $03, $04);
  BasicStatus: TBasicStatus = ($FE, $FD, $00, $01, $02, $03, $04, $DE, $AD, $BE, $EF, $00, $00, $00, $00);
 
...
 
function BinToASCII(const bin: array of byte): AnsiString;
var i: integer;
begin
  SetLength(Result, Length(bin));
  for i := 0 to Length(bin)-1 do
    Result[1+i] := AnsiChar(bin[i]);
end;
 
procedure TForm1.UDPButtonClick(Sender: TObject);
var
  HandShakeRequest: THandShake;
  BasicStatusRequest: TBasicStatus;
  BasicStatusAnswer: array of byte;
  HandShakeAnswer: array of byte;
  NullTermChallenge, ChallengeHEX: string;
  Challenge: integer;
begin
  HandShakeRequest:= HandShake;
  BasicStatusRequest:= BasicStatus;
 
  SetLength(BasicStatusAnswer, 2048);
  SetLength(HandShakeAnswer, 14);
 
  IdUDPClient1.SendBuffer(HandShakeRequest, 7);
  IdUDPClient1.ReceiveBuffer(HandShakeAnswer[0], 14);
 
  NullTermChallenge := BinToASCII(Copy(HandShakeAnswer, 5, 9));
 
  Challenge := StrToInt(NullTermChallenge);
  ChallengeHEX := IntToHex(Challenge, 8);
 
  BasicStatusRequest[7] :=  StrToInt('$' + copy(ChallengeHEX, 1, 2));
  BasicStatusRequest[8] :=  StrToInt('$' + copy(ChallengeHEX, 3, 2));
  BasicStatusRequest[9] :=  StrToInt('$' + copy(ChallengeHEX, 5, 2));
  BasicStatusRequest[10] := StrToInt('$' + copy(ChallengeHEX, 7, 2));
 
  IdUDPClient1.SendBuffer(BasicStatusRequest, 15);
  IdUDPClient1.ReceiveBuffer(BasicStatusAnswer[0], 2048);
end;

Вопрос в чем: до строки IdUDPClient1.ReceiveBuffer(BasicStatusAnswer[0], 2048); взаимодействие осуществляется. По идее на пакет BasicStatusRequest должен придти ответ с содержанием статуса сервера. Мне же приходит пакет в 0 байт.
Проверял на ядрах bukkit и spigot.
Подозреваю что на этапе
after parsing the string "9513307\0" as an integer and packing it as a big endian int32, the result should be 00 91 29 5B
получаю не те 4 байта которые требуются.

UPD: выяснил - если отправлять IdUDPClient1.SendBuffer(BasicStatusRequest, 11), то краткий ответ приходит.
UPD2: разобрался сам - требуется сначала запросить краткую информацию и затем полную. Модераторы, просьба удалить тему!
 
Назад
Верх