Poprawne rozłączanie socket i zwalnianie zasobu

0

Witam

Używam w swojej aplikacji dll do której łącze się poprzez socket z zewnątrz. Dll jest klientem i używa TClientSocket. Wszystko działa poprawnie do czasu kiedy chce rozłączyć socket po stronie klient i zwolnic zasób.

Robię to tak:
Client : TClientSocket;
...
Client.Active := false;
Client.Close;
Client.Free;

Zasób może i zwalnia ale niestety nie rozłacza - po stronie serwera nie widzę connection lost/reset.

Znalazłem inne funkcje:

       Client.Socket.Close;
       Client.Socket.Disconnect(?);

Ale trochę nie rozumiem ich znaczenia...czym się różni Client.Close od Client.Socket.Close ? I co mam dać za argument w funkcji Disconnect ? Jest to integer tylko jakoś nie rozumiem jakie to ma zastosowanie po stronie klienta...i dlaczego niszczenie referencji nie powoduje automatycznego disconnecta...

pozdrawiam

0

wszystko masz w helpie.
tu tylko fragment z procedurami o ktore pytasz:

Close method (TCustomWinSocket)
Shuts down the socket connection if it is open.
Delphi syntax:

   procedure Close;

Description
Call Close to terminate an open socket connection. Close triggers an OnSocketEvent of type seDisconnect before the connection is shut down. If the Windows socket is a listening server socket, Close shuts down all open connections to client sockets before shutting down the listening connection.


Disconnect method (TCustomWinSocket)
Shuts down the socket connection represented by a Windows socket handle.
Delphi syntax:

   procedure Disconnect(Socket: TSocket); virtual;

Description

Disconnect is called by the Close method to terminate an individual socket connection.
Disconnect calls the Lock method to make sure the method is thread-safe. Then, it generates an OnSocketEvent of type seDisconnect. After the OnSocketEvent, Disconnect closes the connection. Finally, it calls Unlock to end the critical section started by Lock.

wbij to sobie do glowy:
http://4programmers.net/Forum/Delphi_Pascal/39079-Zanim_cos_napiszesz_-_CZYTAJ_TO

0

Nie odpowiedziałeś mi na żadne moje pytanie a to co napisałeś to ja tez mam (sam wiesz, ze z helpa). A do tego zrobiłeś to w sposób nieuprzejmy...pierw przeczytaj pytanie a potem kozacz z RTFM.

Ponawiam pytanie bo manuala umiem czytać ale praktycznie widzę , ze czegoś mi brakuje/ lub stosuje niepotrzebne powielenie.

0
lipkerson napisał(a)

Zasób może i zwalnia ale niestety nie rozłacza - po stronie serwera nie widzę connection lost/reset.

i nie zobaczysz - implementacja TCP nie ma opcji informowania o zamknięciu połączenia przez jedną ze stron. Rozwiązania są dwa - pierwsze to przed rozłączeniem wysyłać komunikat do serwera, że się rozłączasz, drugie to na serwerze sprawdzać co jakiś czas czy klient jest nadal podłączony

1 użytkowników online, w tym zalogowanych: 0, gości: 1