procedure TForm1.btnInfoClick(Sender: TObject);
var
tempS:string[255];
Reply,count,maxCount:string;
listReply:TStringList;
i:Integer;
begin
Memo1.Lines.Clear;
UdpSocket1.BlockMode:=bmNonBlocking;//неблокирующий режим
UdpSocket1.RemoteHost:=edtIp.Text;
UdpSocket1.RemotePort:=edtPort.Text;
listReply:=TStringList.Create;
try
UdpSocket1.Open;
UdpSocket1.Sendln('яяяяTSource Engine Query',' ');
UdpSocket1.ReceiveBuf(tempS,255);
UdpSocket1.WaitForData(1000);//сколько ждать данные
Reply:=Reply+tempS;
UdpSocket1.ReceiveBuf(tempS,255);
Reply:=Reply+tempS;
UdpSocket1.ReceiveBuf(tempS,255);
Reply:=Reply+tempS;
if Reply='' then
begin
Memo1.Lines.Add('Сервер недоступен!!!');
UdpSocket1.Close;
Exit;
end;
Delete(Reply,1,4);
for I := 0 to Length(Reply)-1 do
begin
if Reply=#0 then
Reply:=#13; //#6
end;
// Reply:=StringReplace(Reply,#6,#13#10,[rfReplaceAll,rfIgnoreCase]);
listReply.text:=Reply;
Memo1.Lines.Add('IP адрес сервера: '+listReply.Strings[0]);
Memo1.Lines.Add('Название сервера: '+listReply.Strings[1]);
Memo1.Lines.Add('Текущая карта: '+listReply.Strings[2]);
Memo1.Lines.Add('Директория игры: '+listReply.Strings[3]);
Memo1.Lines.Add('Описание: '+listReply.Strings[4]);
tempS:=listReply.Strings[5];//hex
count:=Copy(tempS,1,1);//Кол-во игроков на сервере
maxCount:=Copy(tempS,2,1);//Максимальное кол-во игроков
Memo1.Lines.Add('Кол-во игроков на сервере: '+IntToStr(HexToInt(count)));
Memo1.Lines.Add('Максимальное кол-во игроков: '+IntToStr(HexToInt(maxCount)));
finally
listReply.Free;
end;
end;
Данные все были в "нормальном" виде кроме значений кол-ва игроков которые были в hex
для того, чтобы их перевести в integer использовал:
function HexToInt(s: string): integer;
label
gte;
var
tempt: string;
i: integer;
begin
tempt := '';
if s = '' then
begin
HexToInt := 0;
goto gte;
end;
for i := 1 to Length(s) do
begin
tempt := tempt + IntToHex(Ord(s), 2);
end;
HexToInt := StrToInt('$' + tempt);
gte:
end;
Теперь работает и в Delphi 7, в 2010 работает и так и так))
Полный исходник можно скачать отсюда