Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-11-2006, 15:19   #1
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
[Socket C] Identificare disconnessione client

Come si fa a sapere quando un client si disconnette?
Io me ne accorgo solo su recv. Esiste un altro modo?
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2006, 16:22   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
1) recv ritorna 0; oppure
2) send ritorna -1 con errno==EPIPE; oppure
3) poll indica POLLHUP oppure POLLERR; oppure
4) ...semplicemente non te ne accorgi. In caso di chiusura non pulita del canale (può accadere per varie cause), possono trascorrere anche ore prime che il layer tcp notifichi la condizione di errore per timeout. Ti consiglio di attivare il flag SO_KEEPALIVE per abilitare questo controllo.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 25-02-2007, 15:27   #3
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da ilsensine Guarda i messaggi
1) recv ritorna 0; oppure
2) send ritorna -1 con errno==EPIPE; oppure
3) poll indica POLLHUP oppure POLLERR; oppure
4) ...semplicemente non te ne accorgi. In caso di chiusura non pulita del canale (può accadere per varie cause), possono trascorrere anche ore prime che il layer tcp notifichi la condizione di errore per timeout. Ti consiglio di attivare il flag SO_KEEPALIVE per abilitare questo controllo.
sto provando a testare questi eventi con un semplice server che legge da socket (uso la poll(...)) e un client che invia un byte alla volta al server.
per verificare la chiusura brutale di un socket, killo con il segnale 9 il client.
il punto è che:
1) la poll (sul server) non dà né POLLHUP, né POLLERR
2) me accorgo di ciò se faccio + chiamate alla recv sul server (la prima restituisce 0) che mi danno errno = 29 ("Illegal seek") (non sempre però, a volte ritornano sempre 0)

vorrei sapere se setto correttamente il socket TCP con il flag SO_KEEPALIVE sul server (è necessario farlo anche sul client?):
Codice:
..
sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(sd, IPPROTO_TCP, SO_KEEPALIVE, &on, sizeof(on));
bind(sd, (struct sockaddr *) &server_addr, sizeof(server_addr));
listen(sd, MAX_CONNECTIONS);
...
...
new_sd = accept(sd, (struct sockaddr *) &client_addr, &client_len);
setsockopt(new_sd, IPPROTO_TCP, SO_KEEPALIVE, &on, sizeof(on));
...
se così fosse giusto, quanto bisognerebbe aspettare in media per avere riscontro dal layer TCP al riguardo di una connessione chiusa in modo brutale (es: il mio client crasha)?

EDIT: ho provato giusto ora a far crashare il client dopo un tot di trasmissioni provocando un segmentation fault (accesso al contenuto di un puntatore inizializzato a NULL), ma le casistiche sopra (poll e recv) non "segnalano" mai l'errore (niente POLLHUP, POLLERR, recv < 0 con errno > 0)

grazie
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau

Ultima modifica di maulattu : 25-02-2007 alle 16:05.
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 09:46   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da maulattu Guarda i messaggi
sto provando a testare questi eventi con un semplice server che legge da socket (uso la poll(...)) e un client che invia un byte alla volta al server.
per verificare la chiusura brutale di un socket, killo con il segnale 9 il client.
il punto è che:
1) la poll (sul server) non dà né POLLHUP, né POLLERR
Allora darà POLLIN
Quote:
2) me accorgo di ciò se faccio + chiamate alla recv sul server (la prima restituisce 0) che mi danno errno = 29 ("Illegal seek") (non sempre però, a volte ritornano sempre 0)
0 non è un errore, il valore di errno è indefinito se la recv ritorna 0.
La notifica è stata effettuata con successo, recv==0 vuol dire EOF (nel caso dei socket, disconnessione).


Quote:
se così fosse giusto, quanto bisognerebbe aspettare in media per avere riscontro dal layer TCP al riguardo di una connessione chiusa in modo brutale (es: il mio client crasha)?
Ore. Come ti ho detto, il keep alive becca eventi di disconnessione non banali (ad es. un nodo di rete intermedio che si blocca, ecc.) che rendono di fatto impossibile lo scambio dei pacchetti tra le macchine.
Se client e server sono sulla stessa macchina (o su macchine raggiungibili, senza problemi nella connessione di rete) riuscirai sempre ad accorgerti della disconnessione in caso di crash di uno dei programmi.
Se invece stacchi (prova!) la scheda di rete a uno dei due computer, i programmi non si accorgeranno della disconnessione (è corretto, il tcp è pensato per questo: una volta ricollegato il cavo, i programmi riprenderanno a funzionare). In questo caso il keep alive viene in aiuto, se la disconnessione si prolunga per parecchio tempo.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12

Ultima modifica di ilsensine : 26-02-2007 alle 09:50.
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 10:15   #5
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Io per risolvere il problema ho implementato un ping applicativo, avevo bisogno di sapere abbastanza velocemente (15 secondi max) se un client era disconnesso, però lavoravo in LAN.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 10:22   #6
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da tomminno Guarda i messaggi
Io per risolvere il problema ho implementato un ping applicativo, avevo bisogno di sapere abbastanza velocemente (15 secondi max) se un client era disconnesso, però lavoravo in LAN.
Questa è la soluzione corretta se si hanno bisogno di timeout brevi.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 10:38   #7
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ilsensine Guarda i messaggi
Se invece stacchi (prova!) la scheda di rete a uno dei due computer, i programmi non si accorgeranno della disconnessione (è corretto, il tcp è pensato per questo: una volta ricollegato il cavo, i programmi riprenderanno a funzionare).
interessante, però credo che l'esperimento funzioni solo se la si stacca non dalla "parte del computer" ma dall'altra: se per esempio si tratta di un modem USB, a causa dello standard USB il sistema operativo di accorgerà che la periferica è stata rimossa e le reazioni a catena scatenatesi di conseguenza includeranno la disconnessione. se invece stacco il modem dalla linea telefonica...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 13:42   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da 71104 Guarda i messaggi
interessante, però credo che l'esperimento funzioni solo se la si stacca non dalla "parte del computer" ma dall'altra: se per esempio si tratta di un modem USB, a causa dello standard USB il sistema operativo di accorgerà che la periferica è stata rimossa e le reazioni a catena scatenatesi di conseguenza includeranno la disconnessione. se invece stacco il modem dalla linea telefonica...
Forse, ma non è detto. Il traffico IP può viaggiare, in teoria, anche attraverso più di una interfaccia.
Inoltre, solo il computer con il modem se ne può accorgere -- l'altro lato della connessione potrebbe o meno ricevere la notifica.

Non è un problema banale; mi sono capitati programmi rimasti appesi per ore a causa della caduta di una connessione intermedia. Se la stabilità della connessione è un must, occorre implementare dei messaggi di keepalive tra le applicazioni.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 15:39   #9
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Quote:
Originariamente inviato da ilsensine Guarda i messaggi
Allora darà POLLIN

0 non è un errore, il valore di errno è indefinito se la recv ritorna 0.
La notifica è stata effettuata con successo, recv==0 vuol dire EOF (nel caso dei socket, disconnessione).



Ore. Come ti ho detto, il keep alive becca eventi di disconnessione non banali (ad es. un nodo di rete intermedio che si blocca, ecc.) che rendono di fatto impossibile lo scambio dei pacchetti tra le macchine.
Se client e server sono sulla stessa macchina (o su macchine raggiungibili, senza problemi nella connessione di rete) riuscirai sempre ad accorgerti della disconnessione in caso di crash di uno dei programmi.
Se invece stacchi (prova!) la scheda di rete a uno dei due computer, i programmi non si accorgeranno della disconnessione (è corretto, il tcp è pensato per questo: una volta ricollegato il cavo, i programmi riprenderanno a funzionare). In questo caso il keep alive viene in aiuto, se la disconnessione si prolunga per parecchio tempo.
stamattina ho dato un'occhiata al buon Stevens (Unix netw. programming vol 1) e mi son chiarito un po' le idee.
sostanzialmente, se la connessione cade in modo pulito (così sembra succedere anche facendola crashare sia provocando un segm fault, sia killandola con segnale 9), la recv ritorna 0 (probabilm anche la send). In caso si usi la poll(...), allora ritornerà POLLIN.

se invece l'host crasha, con l'opzione SO_ERROR del socket avrà valore ETIMEDOUT (idem se si sta in attesa con SO_KEEPALIVE, ma il timeout è di 2 ore , proprio come diceva ilSensine, altrimenti non me ne accorgo).

se l'host è irraggiungibile, allora con SO_ERROR avrà valore EHOSTUNREACH.

Quote:
Se client e server sono sulla stessa macchina (o su macchine raggiungibili, senza problemi nella connessione di rete) riuscirai sempre ad accorgerti della disconnessione in caso di crash di uno dei programmi.
sì, questo è il mio caso... dunque tu dici che in caso di crash di uno dei due programmi, mi accorgerò della disconnessione con la poll che darà POLLIN, giusto?
è chiaro che comunque terrò conto anche degli altri casi (timeout con keepalive, host unreachable)...
grazie x le dritte
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau

Ultima modifica di maulattu : 26-02-2007 alle 15:41.
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 21:21   #10
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Non so se vi è mai capitato di lavorare con connessioni GPRS.
Un vero incubo.
Provate ad immaginarvi una situazione in cui un dispositivo connesso si disconnette e in seguito riconnette ma il centro servizi continua a tenere aperto il vecchio socket e ancora peggio continua a mandare vecchi dati (che viaggiano con ritardi anche di 2/3 minuti)
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 27-02-2007, 17:01   #11
maulattu
Senior Member
 
L'Avatar di maulattu
 
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
Ne approfitto x chiedere a chi ne sa (ad esempio, il sempre disponibile ilSensine ) da cosa può essere causato questo messaggio di errore:
Quote:
Feb 27 16:00:09 xxx@host inetd[955]: 7006/tcp server failing (looping), service terminated
a questo punto, l'host diventa irraggiungibile
che dite, è inetd che è andato a prostitute?
__________________
Ciao ciao cagnolino Billy
MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen.
XBOX Live GamerTag: InsaneMau
maulattu è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Attenzione agli HDD Western Digital Blue...
MacBook Air M4 a un super prezzo su Amaz...
Dal 12 novembre stretta sui siti porno: ...
Recensione Synology DS725+: tornano i di...
Car of the Year 2026, rivelate le 7 fina...
Il mouse diventa indossabile: Prolo Ring...
Animal Crossing: New Horizons torna in v...
Task Manager impazzito su Windows 11: in...
NZXT: il PC in abbonamento finisce in tr...
Halo 2 e 3: remake in arrivo, multiplaye...
Robot Phone e un nuovo ecosistema AI: HO...
Amazon sorprende tutti: extra 15% di sco...
HONOR 400 Lite 5G a 209,90€: smartphone ...
Asus TUF Gaming F15 con RTX 4070 e i7-12...
OpenAI punta alla quotazione in Borsa: v...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v