Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in '[Архив] Помощь' started by J1Mmy, Oct 6, 2013.

  1. Автор темы
    J1Mmy

    J1Mmy Старожил Пользователь

    Trophy Points:
    103
    Доброго времени суток! Дело такое:
    Пытаюсь написать программу которая будет по UDP протоколу определять статус сервера. Документацию самого протокола можно взять здесь(не реклама!).
    Моя попытка выглядит вот так:
    Code:
    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.
    Подозреваю что на этапе
    получаю не те 4 байта которые требуются.

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

Share This Page