Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi socket-problem (receive + send) (https://www.delphipraxis.net/26099-socket-problem-receive-send.html)

marius86 18. Jul 2004 11:48


socket-problem (receive + send)
 
Hi

also ich hier folgendes schnippselchen:

Delphi-Quellcode:
procedure TServer.ServerSocket2ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
 anzahl:Integer;
  i:Integer;
  r_text:String;
begin

  // Routine für Joinen
 if (flag_connected = True) then
  begin
  r_text:=Socket.ReceiveText;
  users.Items.Add(r_text);
  Memo1.Lines.add('Username: '+r_text);
  flag_connected := False;
  end;

 if (Socket.ReceiveText = 'New_join') then
  begin
  Memo1.Lines.add(Timetostr(now)+': New user connected');
  flag_connected := True;
  end;
   // Ende Routine für Joinen



 if (flag_quit = True) then
  begin

   for i := 0 to users.Items.Count -1 do
    begin
    if (users.Items[i] = Socket.ReceiveText) then
    users.items.Delete(i);
    end;

  Memo1.Lines.add('Username: '+Socket.ReceiveText);
  flag_quit := False;
  end;


 if (Socket.ReceiveText = 'New_quit') then
  begin
  Memo1.Lines.add(Timetostr(now)+': User quit');
  flag_quit := True;
  end;



end;
Erklärung: Wenn jemand eine Verbindung mit dem Server aufbaut, dann wird über den Socket ein Text gesendet mit folgender Proc:

Delphi-Quellcode:
Nachricht := 'New_join';
delay(500);
ClientSocket2.Socket.SendText(Nachricht);
Nachricht := nick.Text;
delay(500);
ClientSocket2.Socket.SendText(Nachricht);
Das Joinen klappt auch noch wunderbar...
nun hab ich in dem Programm bei onClose noch das gleiche allerdings halt mit Nachricht := 'New_quit'...

aber DAS funktioniert nicht. der server bekommt nicht das 'New_quit' und führ dementsprechend auch nichts aus...

was könnte das Problem sein? Ich vermute ggf das man indem Empfangsteil nicht 2 mal hintereiander Socket.Receive abfragen kann?


gruß

Muetze1 18. Jul 2004 16:02

Re: socket-problem (receive + send)
 
Moin!

Was mir auffällt: Wenn du einmal in dem OnClientRead ReceiveText() aufgerufen hast, dann kannst du es in der Procedure nicht nochmal aufrufen, da ReceiveText() dir den Inhalt des Empfangbuffers zurück gibt und dann leert. Also mache einmal ReceiveText(), speichere das in einer Variablen und untersuche diese dann...

MfG
Muetze1

marius86 18. Jul 2004 16:19

Re: socket-problem (receive + send)
 
Zitat:

Zitat von Muetze1
Moin!

Was mir auffällt: Wenn du einmal in dem OnClientRead ReceiveText() aufgerufen hast, dann kannst du es in der Procedure nicht nochmal aufrufen, da ReceiveText() dir den Inhalt des Empfangbuffers zurück gibt und dann leert. Also mache einmal ReceiveText(), speichere das in einer Variablen und untersuche diese dann...

MfG
Muetze1

HI

Stimmt, ist mir zwischenzeitlich auch eingefallen, hab ich auch so gemacht. Aber das hat ja leider nichts mit meinem Problem zu tun. Irgendwie tritt das auch nur sporadisch auf...

alcaeus 18. Jul 2004 16:21

Re: socket-problem (receive + send)
 
Versuch mal den Teil der OnClose in die OnCloseQuery zu verschieben. Es kann sein, dass zum Zeitpunkt des Sendens die Verbindung nicht mehr aktiv ist.

Greetz
alcaeus

Muetze1 18. Jul 2004 19:00

Re: socket-problem (receive + send)
 
Moin!

Genauso gut ist die Trennung zwischen SendText() und ReceiveText() nie gewährleistet. Mit anderen Worten: Es kann leicht vorkommen, dass du mit ReceiveText() einen String bekommst, der von 2 SendText() gesendet wurde, also das er verbunden wieder empfangen wird. Da musst du dir eine ordentliche Trennung zu einfallen lassen...

MfG
Muetze1

marius86 18. Jul 2004 23:32

Re: socket-problem (receive + send)
 
Hi muetze, das hab ich jetzt irgendwie nich verstanden... :shock:

Muetze1 18. Jul 2004 23:35

Re: socket-problem (receive + send)
 
Moin!

Es kann sehr gut vorkommen, wenn du mit SendText einmal z.B. 'Hallo' sendest und irgendwo danach irgendwann auch noch 'du'. Nun kann es aber vorkommen das du bei ReceiveText einfach ein 'Hallodu' bekommst - weil es halt keine Sicherheit gibt, das 2 unterschiedliche SendText Aufrufe in einem ReceiveText enden.

Nun verstanden?

MfG
Muetze1

marius86 19. Jul 2004 00:30

Re: socket-problem (receive + send)
 
Ahh ja danke... nun da hätte ich denn ne Idee... ein Trennzeichenfolge ala ||-||

Also an jeden Text der gesendet wird wird ein ||-|| gehängt damit der Empfänger das aufteilen kann...

nur wie geht das?

bin ein delphi einsteiger.. in php geht sowas mit explode...

Muetze1 19. Jul 2004 11:49

Re: socket-problem (receive + send)
 
Moin!

Einfach mal danach suchen: Hier im Forum suchenexplode

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:13 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