- Баллы
- 103
Доброго времени суток! Дело такое:
Пытаюсь написать программу которая будет по UDP протоколу определять статус сервера. Документацию самого протокола можно взять здесь(не реклама!).
Моя попытка выглядит вот так:
Вопрос в чем: до строки IdUDPClient1.ReceiveBuffer(BasicStatusAnswer[0], 2048); взаимодействие осуществляется. По идее на пакет BasicStatusRequest должен придти ответ с содержанием статуса сервера. Мне же приходит пакет в 0 байт.
Проверял на ядрах bukkit и spigot.
Подозреваю что на этапе
UPD: выяснил - если отправлять IdUDPClient1.SendBuffer(BasicStatusRequest, 11), то краткий ответ приходит.
UPD2: разобрался сам - требуется сначала запросить краткую информацию и затем полную. Модераторы, просьба удалить тему!
Пытаюсь написать программу которая будет по 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.
Подозреваю что на этапе
получаю не те 4 байта которые требуются.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
UPD: выяснил - если отправлять IdUDPClient1.SendBuffer(BasicStatusRequest, 11), то краткий ответ приходит.
UPD2: разобрался сам - требуется сначала запросить краткую информацию и затем полную. Модераторы, просьба удалить тему!