Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Socket.ReceiveText in der Send-Funktion abfragen (https://www.delphipraxis.net/123004-socket-receivetext-der-send-funktion-abfragen.html)

seim 25. Okt 2008 17:56


Socket.ReceiveText in der Send-Funktion abfragen
 
Hi,
üblicherweise sieht die Kommunikation in einem Socket so aus:

Delphi-Quellcode:
procedure TForm1.SendButton(Sender: TObject);
begin
  Socket1.Socket.SendText('ping,ping my server!');
  Log.Items.Add('Ping gesendet');
end;

procedure TForm1.OnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  if Memo1.Socket.ReceiveText = 'i''m online' then
    Log.Items.Add('Server Online');
end;
Jetzt brauche ich allerdings eine Funktion, die nach erfolgreicher Antwort ein True zurückgibt aber der Compiler versteht scheinbar kein deutsch :(
Delphi-Quellcode:
function Ping(IP:string): Boolean;
begin
  Socket1.Socket.SendText('ping,ping my server!');
  "Prüfe alle 5ms auf Antwort (TimeOut 2sek), wenn erhalten" do
    if Antwort = RichtigeAntwort then Result:= True;
end;
Ich würde das mit einer globalen Variable lösen, die von der OnRead procedure geändert wird, allerdings erfordert das eine while Schleife in der Sende procedure, die solange sinnlos ausgeführt wird und CPU Last verschlingt bis ein Text erhalten wurde..

jemand ne Idee? :mrgreen:

turboPASCAL 25. Okt 2008 18:10

Re: Socket.ReceiveText in der Send-Funktion abfragen
 
Wie währe es mit einem Thread ?

Delphi-Quellcode:
function Ping(IP:string): Boolean;
begin
  Socket1.Socket.SendText('ping,ping my server!');
  // "Prüfe alle 5ms auf Antwort (TimeOut 2sek), wenn erhalten" do // soll wohl ein Kommentar sein !?
    if Antwort = RichtigeAntwort then Result:= True;
end;
:stupid:

seim 25. Okt 2008 19:54

Re: Socket.ReceiveText in der Send-Funktion abfragen
 
Glaube sowas nennt sich Pseudo Code.. man beschreibt in Worten die Funktion eines (gewünschten) Programmes, das Problem was ich nicht hinbekomme ist, wie man etwas in der Prozedur empfangen kann in der man auch gesendet hat. Man müsste dazu die Prozedur anhalten und auf den Empfangenen Text warten..

Eine Möglichkeit wäre z.B:
Delphi-Quellcode:
Receive: boolean;
ReceivedText: string;

function Ping(IP: string):boolean;
begin
  Socket1.Socket.SendText('ping,ping my server!');
 
  while not Receive do begin end; //Führt eine leere Schleife aus solange nichts empfangen wurde

  if ReceivedText = DerRichtige then //Erst wenn Receive True wurde wird die while Schleife beendet und das hier ausgeführt
    Result:= True;
end;

procedure TForm1.OnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  Receive:= true;
  ReceivedText:= Socket.ReceiveText;
end;
Allerdings gibt es dabei n Problem:
Während einer "while true do" schleife steht der CPU auf 100% auch wenn nichts ausgeführt wird - ergo: nicht zu gebrauchen

Cyf 25. Okt 2008 23:08

Re: Socket.ReceiveText in der Send-Funktion abfragen
 
Mal spontan, da hier in der Zeit kein anderer Eingang geprüft werden soll (?), weis OnRead zur Laufzeit zu und entferne es dann wieder, andernfalls gibt es bestimmt in der WinSock API was passendes, ist aber schon länger her, dass ich die benutzt hab. Gibt da irgendwas wo man mehrere Sockets auf verschiedene Zustände (kann lesen/schreiben/Veränderung) überprüfen kann und die jeweiligen werden zurückgegeben (ohne Polling).

seim 25. Okt 2008 23:58

Re: Socket.ReceiveText in der Send-Funktion abfragen
 
Also ich hab' es nun so gelöst:

Delphi-Quellcode:
function TScheißhaus.TuMalSpülen(Scheiße: TArsch): Boolean;
var i:integer;
begin
{...}

  i:= 1;
  repeat
    i:= i +1;
    if pos('update_ok', ReceivedText) <> 0 then
      update_ok := true
    else
      update_ok := false;
    Sleep(TimeOutMS); //Das Programm bleibt zwar stehen, jedoch wird die CPU nicht ausgelastet (andere Programme funktionieren weiterhin - der TaskManager auch :D)
  until (update_ok = true) or (i >= TimeOutChecks);

  Result := update_ok;

{...}
end;
Und in der OnRead Prozedur steht nur ein läppisches:
Delphi-Quellcode:
procedure TScheißhaus.OnReceive(Sender: TObject; Socket: TCustomWinSocket);
begin
  ReceivedText:= Socket.ReceiveText;
end;

seim 9. Dez 2008 16:03

Re: Socket.ReceiveText in der Send-Funktion abfragen
 
Ok das geht doch nicht -.-

Hier die final 'n' working Version

Delphi-Quellcode:
function set_led(Lightmap: TLightmapArray): Boolean;
var
  RapeReceivedText : string;
  update_ok : Boolean; //Erhalt der Lightmap
  Bits : string;
  i, j, k : integer;
begin

{...}

  i:= 0;
  repeat
    i:= i +1;
    RapeReceivedText:= RapeSock.Client.Socket.ReceiveText; //<-- so geht es!! ..zu einfach um selbst drauf zu kommen ^.^
    if pos('update_ok', RapeReceivedText) <> 0 then
      update_ok := true
    else
      update_ok := false;
    Sleep(RapeTimeOutMS);
  until (update_ok = true) or (i >= RapeTimeOutChecks);

  Result := update_ok;

{...}

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz