Synapse: Wie Daten empfangen

Alle Fragen zur Netzwerkkommunikation
Antworten
ufkpra2
Beiträge: 32
Registriert: Fr 14. Mai 2010, 14:47
CPU-Target: i386
Wohnort: Ulm

Synapse: Wie Daten empfangen

Beitrag von ufkpra2 »

Hallo,

ich will mittels synaps über nen Socket Daten empfangen. Zunächst sollen zum Testen diese einfach ausgegeben werden, allerdings bekomme ich dabei immer den Fehlercode 10054 (connection reset by peer). Der Connect mit dem Client an sich funktioniert noch, beim Übermitteln der Nachricht scheint dann beim Empfang etwas schief zu laufen.

Hat jemand 'ne idee, was ich falsch mache?

Hier der Empfänger:

Code: Alles auswählen

sock:   TTCPBlockSocket;
[...]
procedure TEchoServer.Execute;
begin
  sock.Bind('0.0.0.0', '33335');
  sock.Listen;
 
  if sock.LastError <> 0 then
  begin
    ShowMessage('Error a, ' + IntToStr(sock.LastError));
    exit;
  end;
  buffer := 'execute...';
  Synchronize(@display1);
  repeat
    if terminated then
    begin
      ShowMessage('Error b, terminated');
      break;
    end;
 
    buffer := 'Received: ' + sock.RecvPacket(5000);
    if sock.lasterror = 0 then
      Synchronize(@display1)
    else
    begin
      buffer := 'Error: ' + IntToStr(sock.LastError);
      Synchronize(@display2);
    end;
  until False;
end;

Sender:

Code: Alles auswählen

procedure TForm1.Button3Click(Sender: TObject);
var
  sock:   TTCPBlockSocket;
  abort:  boolean = False;
begin
  sock := TTCPBlockSocket.Create;
  sock.Connect('127.0.0.1', edit2.Text);
 
  if sock.LastError <> 0 then
  begin
    ShowMessage('Connection error. ' + IntToStr(sock.LastError));
    abort := True;
  end;
 
  if not abort then
  begin
    sock.SendString(edit1.Text + CRLF);
  end;
 
  sock.CloseSocket;
  sock.Free;
end;
Vielen dank schon mal im Vorraus,
Heinz

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Synapse: Wie Daten empfangen

Beitrag von Scotty »

Benutze einfach RecvString(). Ansonsten bitte mitliefern, wie Buffer definiert ist und wie dessen Größe reserviert wurde (vermutlich ist das der Grund für den Absturz). Ansonsten würde ich noch statt "repeat until false" "until terminated" schreiben. Ist aber eher Geschmackssache.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Synapse: Wie Daten empfangen

Beitrag von af0815 »

Code: Alles auswählen

buffer := 'Received: ' + sock.RecvPacket(5000);
Hier wird auf 5000 Bytes gewartet. Ich wette der Client schickt weniger, dann wird die Verbindung vom Client zurückgesetzt und der Server steht vor einer abgebrochenen Verbindung, hat aber seine 5000 nicht beisammen und was nun -> Fehlermeldung ausgeben ist die Konsequenz.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse: Wie Daten empfangen

Beitrag von theo »

af0815 hat geschrieben:

Code: Alles auswählen

buffer := 'Received: ' + sock.RecvPacket(5000);
Hier wird auf 5000 Bytes gewartet.
Bei Synapse nicht. Das ist der Timeout.
http://synapse.ararat.cz/doc/help/blcks ... RecvPacket" onclick="window.open(this.href);return false;

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Synapse: Wie Daten empfangen

Beitrag von af0815 »

Noch genauer gesagt in LastError sollte sich WSAETIMEDOUT befinden.

Ich würde mit WaitingDataEx zuerst mal abfragen ob was da ist, und dann mit ReceiveBufferEx genau die Daten abholen und dann die Daten überprüfen, ob alles da ist, was ich erwartet habe.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

ufkpra2
Beiträge: 32
Registriert: Fr 14. Mai 2010, 14:47
CPU-Target: i386
Wohnort: Ulm

Re: Synapse: Wie Daten empfangen

Beitrag von ufkpra2 »

Vielen Dank für Eure bisherige Hilfe!

buffer ist als String deklariert:

Code: Alles auswählen

buffer: string;

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Synapse: Wie Daten empfangen

Beitrag von Scotty »

Dann zitiere ich mich selbst :mrgreen:
Scotty hat geschrieben:Benutze einfach RecvString().

Antworten