2012-10-24 12 views
7

Sto usando TTCPBlockSocket per un'applicazione TCP/IP. Il problema è che non riesco a determinare quando la connessione è persa.Delphi + Synapse: Come verificare se sono ancora connesso

GetLastError restituisce 0
Read restituisce 0

Ma che incontro questi valori eaven se l'applicazione è collegata in modo riesco a farlo come posso essere avvisato quando la connessione TCP/IP è perduto.

Grazie

+0

Direi che la chiamata di funzione ['CanRead'] (http://synapse.ararat.cz/doc/help/blcksock.TBlockSocket.html#CanRead) che passa 0 come parametro' Timeout' è ciò che sei cercando. Questa funzione chiama internamente 'InternalCanRead' che esegue la funzione Winsock [' select'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141 (v = vs.85) .aspx). La funzione 'CanRead' restituisce False se si verifica un errore. – TLama

+1

@TLama ci proverò grazie. – opc0de

+0

@TLama la tua risposta mi ha indirizzato verso il giusto percorso: la seguente condizione deve essere soddisfatta per verificare se è disconnessa se TCPBlockSocket.CanRead (0) e TCPBlockSocket.WaitingData = 0 il disconnesso: = true. Puoi postare questa come risposta per me per accettare – opc0de

risposta

1

direi, è possibile utilizzare il metodo CanRead, passando da 0 a suo parametro Timeout. Questa funzione esegue internamente la funzione select per il socket e restituisce False quando si verifica un errore. Dovrebbe essere sufficiente utilizzare solo questo metodo poiché la funzione select restituisce SOCKET_ERROR se si perde la connessione e causa il metodo CanRead restituisce False come risultato. Quindi penso, è sufficiente per verificare se la connessione socket è vivo in questo modo:

function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean; 
begin 
    Result := ASocket.CanRead(0); 
end; 
+0

Nope non è sufficiente testarlo +1 per questo – opc0de

+0

Il metodo 'WaitingData' (come aggiunto) restituisce la quantità di dati in sospeso nel buffer di input della rete, e se quella chiamata interna' ioctlsocket' non fallisce con il 'SOCKET_ERROR' e restituisce l'importo dei dati in sospeso nel momento in cui la connessione è già persa, quindi non riflette le tue esigenze. O mi sbaglio ? (sfortunatamente, non posso testarlo ora) – TLama

1

Come dice opC0de, per verificare se il client è ancora connesso è necessario effettuare il check TCPBlockSocket.CanRead (0) e TCPBlockSocket. WaitingData = 0

function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean; 
begin 
    Result := (ASocket.Socket = INVALID_SOCKET) or ((ASocket.WaitingData = 0) and ASocket.CanRead(0)); 
end; 

Sto usando in questo modo nei miei progetti, quindi posso confermare che funziona.

+0

Funziona come previsto se scolleghi il cavo di rete? – mjn

Problemi correlati