![]() |
Socket.ReceiveText in der Send-Funktion abfragen
Hi,
üblicherweise sieht die Kommunikation in einem Socket so aus:
Delphi-Quellcode:
Jetzt brauche ich allerdings eine Funktion, die nach erfolgreicher Antwort ein True zurückgibt aber der Compiler versteht scheinbar kein deutsch :(
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;
Delphi-Quellcode:
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..
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; jemand ne Idee? :mrgreen: |
Re: Socket.ReceiveText in der Send-Funktion abfragen
Wie währe es mit einem Thread ?
Delphi-Quellcode:
:stupid:
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; |
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:
Allerdings gibt es dabei n Problem:
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; Während einer "while true do" schleife steht der CPU auf 100% auch wenn nichts ausgeführt wird - ergo: nicht zu gebrauchen |
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).
|
Re: Socket.ReceiveText in der Send-Funktion abfragen
Also ich hab' es nun so gelöst:
Delphi-Quellcode:
Und in der OnRead Prozedur steht nur ein läppisches:
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;
Delphi-Quellcode:
procedure TScheißhaus.OnReceive(Sender: TObject; Socket: TCustomWinSocket);
begin ReceivedText:= Socket.ReceiveText; end; |
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:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz