Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
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


Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Grazie a GLIMPSE-17775 il telescopio spa...
Samsung Galaxy A27 5G è ufficiale...
TCL aggiorna la sua gamma di monitor per...
Anche OPPO avrà uno smartphone co...
La Radeon RX 9070 XT appare su Steam e m...
L'America si ribella ai datacenter: bloc...
'Artificial General Engineer': l'IA di J...
Il drone NASA Dragonfly, che voler&agrav...
Stop immediato a Fable 5 e Mythos 5: il ...
"Prime Day Amazon il 23-26 giugno": sì e...
Oggi 2 super MacBook Pro M5 e M5 Pro, 24...
Tineco Floor One Station S9 Artist: il s...
Raggiunte nuove altitudine e velocit&agr...
Apple Watch Series 11 GPS a 339€ su Amaz...
Come un MacBook, ma con la RTX 5070: MSI...
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: 00:09.


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