Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-11-2006, 14: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, 15: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, 14: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 15:05.
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 08: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 08:50.
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 09: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, 09: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, 09: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, 12: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, 14: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 14:41.
maulattu è offline   Rispondi citando il messaggio o parte di esso
Old 26-02-2007, 20: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, 16: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


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
Prime foto reali per OPPO Find X9 Ultra:...
Il leak di Claude Code diventa un'esca: ...
Netflix, batosta in Italia: aumenti ille...
UFO e complotti: chi si cela dietro la n...
Batterie EV difficili da riciclare: il p...
Non vuoi targare il monopattino? Engwe h...
Oracle AI World Tour Milano: dall'IA age...
Gli astronauti di Artemis II hanno avuto...
Quando arriverà iOS 26.5? Il debu...
AI Agent Traps: il paper DeepMind che ca...
Addio licenza proprietaria: Gemma 4 pass...
LG OLED in offerta su Amazon: quattro TV...
Amazon punta a Globalstar per sfidare St...
Successo immediato per The Super Mario G...
Raspberry Pi alza ancora i prezzi: Pi 5 ...
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: 12:38.


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