Socket & c++ [RISOLTO]
Moderatore: Staff
Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- tgmx
- Linux 4.x

- Messaggi: 1336
- Iscritto il: ven 28 apr 2006, 14:40
- Slackware: 14.1
- Desktop: KDE 4
- Località: Ancona
Socket & c++ [RISOLTO]
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.
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.
Ultima modifica di tgmx il ven 27 apr 2007, 14:58, modificato 1 volta in totale.
- masalapianta
- Iper Master

- Messaggi: 2775
- Iscritto il: lun 25 lug 2005, 0:00
- Nome Cognome: famoso porco
- Kernel: uname -r
- Desktop: awesome
- Distribuzione: Debian
- Località: Roma
- Contatta:
Re: Socket & c++
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 persistentitgmx 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.
- tgmx
- Linux 4.x

- Messaggi: 1336
- Iscritto il: ven 28 apr 2006, 14:40
- Slackware: 14.1
- Desktop: KDE 4
- Località: Ancona
Re: Socket & c++
Infatti il problema è a livello di applicazione... quando per qualche motivo stacco e riattacco il cavo di rete il programma crasha.masalapianta ha scritto: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 persistentitgmx 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.
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?
- masalapianta
- Iper Master

- Messaggi: 2775
- Iscritto il: lun 25 lug 2005, 0:00
- Nome Cognome: famoso porco
- Kernel: uname -r
- Desktop: awesome
- Distribuzione: Debian
- Località: Roma
- Contatta:
Re: Socket & c++
"il programma crasha" e' un attimo generico, magari usando codice di debug, strace, un debugger e uno sniffer puoi riuscire a collezionare informazioni utilitgmx ha scritto:Infatti il problema è a livello di applicazione... quando per qualche motivo stacco e riattacco il cavo di rete il programma crasha.masalapianta ha scritto: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 persistentitgmx 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.
Dovrei fare in modo che prima di ogni lettura o scrittura il programma si assicuri che la connessione è attiva.
nel gapil l'uso dei socket tcp e' trattato abbastanza bene (compresa la gestione degli errori):Hai per le mani qualche semplice guida di approfondimento?
http://www.lilik.it/~mirko/gapil/gapilc ... 2-29300015
- tgmx
- Linux 4.x

- Messaggi: 1336
- Iscritto il: ven 28 apr 2006, 14:40
- Slackware: 14.1
- Desktop: KDE 4
- Località: Ancona
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...
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...
- tgmx
- Linux 4.x

- Messaggi: 1336
- Iscritto il: ven 28 apr 2006, 14:40
- Slackware: 14.1
- Desktop: KDE 4
- Località: Ancona
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
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
- masalapianta
- Iper Master

- Messaggi: 2775
- Iscritto il: lun 25 lug 2005, 0:00
- Nome Cognome: famoso porco
- Kernel: uname -r
- Desktop: awesome
- Distribuzione: Debian
- Località: Roma
- Contatta:
e se avessi usato codice di debug e un debugger (come ti avevo consigliato) te ne saresti accorto subitotgmx 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).
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)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.
