Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Windows Socket sauber Schließen (https://www.delphipraxis.net/16230-windows-socket-sauber-schliessen.html)

neolithos 13. Feb 2004 11:11


Windows Socket sauber Schließen
 
Ich habe einen kleinen Server geschrieben der Anfragen an eine Datenbank ausführt und das Ergebnis zurück sendet.

Nun weis ich aber Leider nicht wie ich die zuvor aufgebaute Verbindung sauber schließe.

Listener Thread zum Abhörchen nach Verbindungen:
Delphi-Quellcode:
procedure T .Execute;
var fClient : TSockAddr;
    iRet,
    iLen : Integer;
    fReadSet : TFDSet;
    fTime : TTimeVal;

    ...
    ZeroMemory(@fClient, SizeOf(fClient));
    iLen := SizeOf(fClient);
    fTime.tv_sec := 0;
    fTime.tv_usec := 1000 * 300; // warte 500 ms
    repeat
      FD_ZERO(fReadSet);
      FD_SET(iSocket, fReadSet);
      select(0, @fReadSet, nil, nil, @fTime);
     
      // Liegt was an??
      if FD_ISSET(iSocket, fReadSet) then
         begin
           iRet := accept(iSocket, @fClient, @iLen);
           if iRet > 0 then // Anfrage in Thread ausführen
              TMDERequest.Create(iRet, inet_ntoa(fClient.sin_addr));
         end;
    until Terminated;
    ...
Das Arbeitstier was so nicht funktioniert:

Delphi-Quellcode:
procedure TMDERequest.Execute;
...
   recv( ??? ); // Anfrage Empfangen
...
   send( ??? ); // Ergebnis Senden
...
    Sleep(2000);
    closesocket(iSocket); // Das funktioniert so nicht ?
...
Hilfe, ich bin zu doof dazu!

negaH 13. Feb 2004 13:54

Re: Windows Socket sauber Schließen
 
Das Schließen eines Sockets ist immer ein Problem. Egal wie man es macht im Grunde unterbricht immer eine Seite, eg Client oder Server, die Verbindung.

Ich mache es so das der Client ein Kommando sendet das er den Socket schließen will. Darauf hin schließt der Server den Socket mit CloseSocket(). Der Client hat nach dem Senden des Kommandos noch zu warten, ca. 2 Sekunden, und schließt dann ebenfalls den Socket. Sinn der Übung ist es die mögliche Fehlermeldung das der Socket unterbrochen wurde, eg. in Indy "Connection closed gracefully", auf Client Seite zu verlagern. Damit wird also der Server entlastet. Sollte das TCP/IP Packet des Kommandos zum Schließen nicht innerhalb von 2 Sekunden vom Server bearbeitet wurden sein, so bekommt der Server obige Fehlermeldung. Sogesehen ist die Fehlermeldung im Indy garkein Fehler ansich.

Gruß Hagen

neolithos 13. Feb 2004 14:11

Re: Windows Socket sauber Schließen
 
Wert es mal so angehen!

Mal sehen!

neolithos 13. Feb 2004 14:36

Re: Windows Socket sauber Schließen
 
So läuft es erstmal prima! Juhu!

Trotzdem, falls es noch andere Ideen gibt! Ich bin ganz Ohr!


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