Thema: Delphi Query an Gameserver

Einzelnen Beitrag anzeigen

Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beiträge
 
Turbo Delphi für Win32
 
#59

AW: Query an Gameserver

  Alt 24. Feb 2015, 18:29
Hab ich den ganzen Quatsch da oben jetzt umsonst geschrieben?
Nein ! Nichts ist umsonst wenn du helfen möchtest.

Das Konzept gefällt mir.
Ich kannte die Funktion MOVE nicht und wie man merkt habe ich auch sonst wenig mit dynamischen Inhalten gearbeitet in Delphi.

Ich habe ein wenig mit deinem Code rumprobiert und hab ihn halt um die IP und den Port erweitert. Das Ergebnis wenn ich zB. den Servernamen anzeigen lassen möchte ist jedoch mit mehrmaligem hin und her Probieren ernüchternd gewesen. Wahrscheinlich auf meine Dusseligkeit zurückzuführen.

Delphi-Quellcode:
procedure GetInfo;
var
  request: TInfoRequest;
  response: TInfoResponse;
  buffer: TBufferArray;
  i: Integer;
begin
  request.RequestHeader := -1;
  request.PacketHeader := 'T';
  request.Payload := 'Source Engine Query'; // Von mir aus auch mit einer Konstante oder einem Ressourcestring
  request.Payload[19] := #0;

  form4.udp1.RemoteHost:= form4.edit1.Text;
  form4.udp1.RemotePort:= form4.edit2.Text;
  form4.udp1.Open;

  if (form4.udp1.Connected) then

  form4.Udp1.SendBuf(request, SizeOf(TInfoRequest));
  form4.Udp1.ReceiveBuf(buffer, SizeOf(buffer));

  i := 0;
  Move(buffer[i], response.ResponseHeader, SizeOf(response.ResponseHeader)); inc(i, SizeOf(response.ResponseHeader));
  Move(buffer[i], response.PacketHeader, SizeOf(response.PacketHeader)); inc(i, SizeOf(response.PacketHeader));
  Move(buffer[i], response.Protocol, SizeOf(response.Protocol)); inc(i, SizeOf(response.Protocol));
  response.Name := GetString(buffer, i);
  response.Map := GetString(buffer, i);
  response.Folder := GetString(buffer, i);
  response.Game := GetString(buffer, i);
  Move(buffer[i], response.ID, SizeOf(response.ID)); inc(i, SizeOf(response.ID));
  Move(buffer[i], response.Players, SizeOf(response.Players)); inc(i, SizeOf(response.Players));
  Move(buffer[i], response.MaxPlayers, SizeOf(response.MaxPlayers)); inc(i, SizeOf(response.MaxPlayers));
  Move(buffer[i], response.Bots, SizeOf(response.Bots)); inc(i, SizeOf(response.Bots));
  Move(buffer[i], response.ServerType, SizeOf(response.ServerType)); inc(i, SizeOf(response.ServerType));
  Move(buffer[i], response.Environment, SizeOf(response.Environment)); inc(i, SizeOf(response.Environment));
  Move(buffer[i], response.Visibility, SizeOf(response.Visibility)); inc(i, SizeOf(response.Visibility));
  Move(buffer[i], response.VAC, SizeOf(response.VAC)); inc(i, SizeOf(response.VAC));
  response.Version := GetString(buffer, i);

     form4.lblServerName.Caption := response.Name;
Das Ergebnis sind nur viele Zahlen die ich meinen vorherigen Antworten vom Server nicht zuweisen konnte.
Zitat:
91764584458393326911211199104327911410510310511011 53240494648465346494749505353525641
Sir Rufo. Ich glaube du gehst von einer falschen Grundsituation aus. Es ist nett dass du mir helfen möchtest und du gibst dir auch gut Mühe mich "richtig" anzustupsen. Jedoch scheinst du zu denken, dass ich nicht verstehe, was du mir bis jetzt beibringen wolltest und scheinbar immernoch willst. Aber du musst einsehen, dass ich verstanden habe was du mir mitteilen möchtest.
Ich habe jetzt verstanden was Byte, String und short für mich zu bedeuten hat.
Wenn ich nach der Länge "Byte" "lesen" lasse, wird auch nur ein Byte (2 physische Zahlen im optischen Sinne) gesucht bzw. ausgegeben. wenn ich 2 Byte lesen lasse, werden 4 Zahlen gelesen.
Ich hoffe ich beruhige dich etwas damit und verärgere dich nicht noch mehr falls das nicht das war was du mir mitteilen wolltest.

MFG
Flo
  Mit Zitat antworten Zitat