Socket & c++ [RISOLTO]

Area di discussione libera.

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

Socket & c++ [RISOLTO]

Messaggio 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.
Ultima modifica di tgmx il ven 27 apr 2007, 14:58, modificato 1 volta in totale.

Bart
Staff
Staff
Messaggi: 4249
Iscritto il: lun 9 ago 2004, 0:00
Località: Rimini

Messaggio da Bart »

Potresti fare un controllo ogni tot secondi (tipo un ping) per vedere se il server è ancora raggiungibile.

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Messaggio da Dani »

Potrebbe essere irrangiungibile per diverse ragioni, non solo dopo la disconnessione del cavo di rete...

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

E con questo?
Se gli interessa solo sapere se il server è ancora online basta fare quello che ha detto Bart....

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio 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?

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

Credo che dovresti chiudere il socket manualmente per poi eventualmente provare a riaprirlo..........

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Messaggio 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?

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio 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à.

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio 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!
;)

Avatar utente
masalapianta
Iper Master
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++

Messaggio 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

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Re: Socket & c++

Messaggio 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?

Avatar utente
masalapianta
Iper Master
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++

Messaggio 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

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio 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... :(

Avatar utente
tgmx
Linux 4.x
Linux 4.x
Messaggi: 1336
Iscritto il: ven 28 apr 2006, 14:40
Slackware: 14.1
Desktop: KDE 4
Località: Ancona

Messaggio 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

Avatar utente
masalapianta
Iper Master
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:

Messaggio 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)

Rispondi