AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Socket.ReceiveText in der Send-Funktion abfragen
Thema durchsuchen
Ansicht
Themen-Optionen

Socket.ReceiveText in der Send-Funktion abfragen

Ein Thema von seim · begonnen am 25. Okt 2008 · letzter Beitrag vom 9. Dez 2008
Antwort Antwort
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#1

Socket.ReceiveText in der Send-Funktion abfragen

  Alt 25. Okt 2008, 17:56
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 onlinethen
    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?
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Socket.ReceiveText in der Send-Funktion abfragen

  Alt 25. Okt 2008, 18:10
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;
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#3

Re: Socket.ReceiveText in der Send-Funktion abfragen

  Alt 25. Okt 2008, 19:54
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
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#4

Re: Socket.ReceiveText in der Send-Funktion abfragen

  Alt 25. Okt 2008, 23:08
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).
  Mit Zitat antworten Zitat
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#5

Re: Socket.ReceiveText in der Send-Funktion abfragen

  Alt 25. Okt 2008, 23:58
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;
  Mit Zitat antworten Zitat
Benutzerbild von seim
seim

Registriert seit: 11. Nov 2007
83 Beiträge
 
#6

Re: Socket.ReceiveText in der Send-Funktion abfragen

  Alt 9. Dez 2008, 16:03
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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