Pagina 1 di 2

Socket & c++ [RISOLTO]

Inviato: ven 20 apr 2007, 19:18
da tgmx
Ciao Ragazzi,

ho un dubbio, sto sviluppando una piccola applicazione che crea una socket e la usa per connettersi ad un server.

Secondo voi come faccio (lato client) a rilevare che la connessione è caduta per la disconnessione del cavo di rete?

GRAZIE.

Inviato: ven 20 apr 2007, 19:59
da Bart
Potresti fare un controllo ogni tot secondi (tipo un ping) per vedere se il server è ancora raggiungibile.

Inviato: ven 20 apr 2007, 20:04
da Dani
Potrebbe essere irrangiungibile per diverse ragioni, non solo dopo la disconnessione del cavo di rete...

Inviato: ven 20 apr 2007, 20:44
da V
E con questo?
Se gli interessa solo sapere se il server è ancora online basta fare quello che ha detto Bart....

Inviato: ven 20 apr 2007, 21:06
da tgmx
...e se in qualche modo riuscissi a rilevare che non c'è più comunicazione quale portebbe essere il passo successivo? chiudere la vecchia socket e ricrearla?

Tra l'altro, il fatto che il cavo venga staccato comporta la chiusura della socket?

Inviato: ven 20 apr 2007, 23:03
da V
Credo che dovresti chiudere il socket manualmente per poi eventualmente provare a riaprirlo..........

Inviato: sab 21 apr 2007, 0:54
da Dani
V ha scritto:E con questo?
E con questo la domanda era:
Secondo voi come faccio (lato client) a rilevare che la connessione è caduta per la disconnessione del cavo di rete?

Inviato: sab 21 apr 2007, 11:22
da tgmx
Credo che unirò i consigli che mi avete dato:

faccio un "ping" periodico e in caso di esito negativo provo a chiudere e riaprire la/il ( :) ) socket.

Per adesso grazie, vi aggiorno appena vedo se và.

Inviato: sab 21 apr 2007, 12:08
da V
tgmx ha scritto:Credo che unirò i consigli che mi avete dato:

faccio un "ping" periodico e in caso di esito negativo provo a chiudere e riaprire la/il ( :) ) socket.

Per adesso grazie, vi aggiorno appena vedo se và.
Credo sia la soluzione migliore! Buona fortuna con il/la socket!
;)

Re: Socket & c++

Inviato: sab 21 apr 2007, 19:36
da masalapianta
tgmx ha scritto:Ciao Ragazzi,

ho un dubbio, sto sviluppando una piccola applicazione che crea una socket e la usa per connettersi ad un server.

Secondo voi come faccio (lato client) a rilevare che la connessione è caduta per la disconnessione del cavo di rete?

GRAZIE.
uh? usi un approccio sbagliato, a controllare lo stato della connessione tcp (dal layer 4 compreso in giu) ci pensa il kernel (eventualmente puoi fare un po di tuning tramite le sysctl tcp_keepalive*, tcp_fin_timeout, ecc..), se invece temi che il problema possa sorgere a livello applicativo (il processo che sta all'altro capo del socket per qualche motivo si freeza) allora devi implementare un keepalive a layer 7 (un esempio e' il ping/pong del protocollo irc), ma questo ha senso solo per connessioni persistenti

Re: Socket & c++

Inviato: gio 26 apr 2007, 14:53
da tgmx
masalapianta ha scritto:
tgmx ha scritto:Ciao Ragazzi,

ho un dubbio, sto sviluppando una piccola applicazione che crea una socket e la usa per connettersi ad un server.

Secondo voi come faccio (lato client) a rilevare che la connessione è caduta per la disconnessione del cavo di rete?

GRAZIE.
uh? usi un approccio sbagliato, a controllare lo stato della connessione tcp (dal layer 4 compreso in giu) ci pensa il kernel (eventualmente puoi fare un po di tuning tramite le sysctl tcp_keepalive*, tcp_fin_timeout, ecc..), se invece temi che il problema possa sorgere a livello applicativo (il processo che sta all'altro capo del socket per qualche motivo si freeza) allora devi implementare un keepalive a layer 7 (un esempio e' il ping/pong del protocollo irc), ma questo ha senso solo per connessioni persistenti
Infatti il problema è a livello di applicazione... quando per qualche motivo stacco e riattacco il cavo di rete il programma crasha.
Dovrei fare in modo che prima di ogni lettura o scrittura il programma si assicuri che la connessione è attiva.

Hai per le mani qualche semplice guida di approfondimento?

Re: Socket & c++

Inviato: gio 26 apr 2007, 15:13
da masalapianta
tgmx ha scritto:
masalapianta ha scritto:
tgmx ha scritto:Ciao Ragazzi,

ho un dubbio, sto sviluppando una piccola applicazione che crea una socket e la usa per connettersi ad un server.

Secondo voi come faccio (lato client) a rilevare che la connessione è caduta per la disconnessione del cavo di rete?

GRAZIE.
uh? usi un approccio sbagliato, a controllare lo stato della connessione tcp (dal layer 4 compreso in giu) ci pensa il kernel (eventualmente puoi fare un po di tuning tramite le sysctl tcp_keepalive*, tcp_fin_timeout, ecc..), se invece temi che il problema possa sorgere a livello applicativo (il processo che sta all'altro capo del socket per qualche motivo si freeza) allora devi implementare un keepalive a layer 7 (un esempio e' il ping/pong del protocollo irc), ma questo ha senso solo per connessioni persistenti
Infatti il problema è a livello di applicazione... quando per qualche motivo stacco e riattacco il cavo di rete il programma crasha.
Dovrei fare in modo che prima di ogni lettura o scrittura il programma si assicuri che la connessione è attiva.
"il programma crasha" e' un attimo generico, magari usando codice di debug, strace, un debugger e uno sniffer puoi riuscire a collezionare informazioni utili
Hai per le mani qualche semplice guida di approfondimento?
nel gapil l'uso dei socket tcp e' trattato abbastanza bene (compresa la gestione degli errori):
http://www.lilik.it/~mirko/gapil/gapilc ... 2-29300015

Inviato: gio 26 apr 2007, 19:34
da tgmx
Il link che mi hai dato ha iniziato a farmi capire qualcosa di più.

Il fatto è che la mia applicazione effettua la connessione tramite socket all'avvio, successivamente avvia un thread che ha il solo scopo di effettuare letture sul socket in un loop infinito.

Se ad un certo punto stacco il cavo di rete o per qualche motivo il server va giù il thread continua a leggere (valori sballati) ma non crasha. I'errore avviene quando riattacco il cavo (e crasha con un bel segmentation fault).

Girando su google mi sembra da aver capito che abilitando "SO_KEEPALIVE" si possano gestire queste cose ma non mi è molto chiaro come.

Inizio a credere di essermi imbattuto in qualcosa fuori dalla mia portata... :(

Inviato: ven 27 apr 2007, 14:58
da tgmx
In qualche modo ho risolto:

intanto, con grande vergogna, ho scoperto che il programma crashava quando chiudevo il socket perchè usavo la funzione close sbagliata (sono in QT3).

Per il resto mi limito a vedere se in risposta ad una lettura ho un valore ammissibile, in caso contrario chiudo e riapro il socket e tutto sembra filare liscio.

PS la funzione SO_KEEPALIVE mi sembra di aver capito che non fa proprio al caso mio.


GRAZIE A TUTTI

Inviato: ven 27 apr 2007, 15:16
da masalapianta
tgmx ha scritto:In qualche modo ho risolto:

intanto, con grande vergogna, ho scoperto che il programma crashava quando chiudevo il socket perchè usavo la funzione close sbagliata (sono in QT3).
e se avessi usato codice di debug e un debugger (come ti avevo consigliato) te ne saresti accorto subito ;)
Per il resto mi limito a vedere se in risposta ad una lettura ho un valore ammissibile, in caso contrario chiudo e riapro il socket e tutto sembra filare liscio.

PS la funzione SO_KEEPALIVE mi sembra di aver capito che non fa proprio al caso mio.
dipende che devi fare, SO_KEEPALIVE (che non e' una funzione ma un parametro da passare a setsockopt() ) fa si che il kernel mandi periodicamente dei keep-alive all'altro peer; di default lo stack tcp/ip di linux ne manda uno ogni 7200 secondi (due ore) ma come ho gia scritto e' configurabile via sysctl tcp_keepalive* (ma attenzione, configurandolo il nuovo valore avra' effetto su tutte le connessioni fatte su quella macchina e non solo su quella del tuo applicativo)