Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
Dopo anni di attesa e una lunga fase di sviluppo, Noctua entra nel mercato dei dissipatori a liquido AIO con la nuova serie NL-LC1. Forte dell'esperienza maturata nel raffreddamento ad aria, l'azienda austriaca promette di portare la propria filosofia fatta di qualità costruttiva, attenzione ai dettagli e silenziosità anche in questo segmento. Abbiamo provato il nuovo sistema per scoprire se riesce a distinguersi in un mercato ormai molto competitivo.
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Arrivato sul mercato italiano a fine marzo, la serie Boox Go 10.3 (Gen II) offre Android 15, penna da 4096 livelli e retroilluminazione opzionale (nel modello da noi provato, Lumi, presente). La serie si compone di due tablet ePaper che fanno da e-reader, blocco note digitale e persino browser, tutto a un prezzo che fa dimenticare i prodotti di brand più blasonati
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
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


NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
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...
Kioxia Exceria G3: il modella da 4 TB &e...
Gemini 3.5 Flash delude nei test Android...
DREAME X50 Ultra Complete a 749€ per il ...
Prezzi console handheld alle stelle: la ...
Toyota presenta il primo pickup elettric...
Prime Day anticipato, tutti gli smartpho...
Dyson V10 Konical: il primo aspirapolver...
FSR 4.1 su Radeon 6000, AMD spiega perch...
Hisense svela la gamma TV 2026: RGB Mini...
Narwal lancia gli sconti Prime Day 2026:...
SpaceX ha comprato Cursor: accordo da 60...
Commodore Callback 8020 è il tele...
roborock F25 Ultra a 585€ con Prime: vap...
Apple Watch SE 3 a 219€ e Series 11 a 32...
La lampadina diventa una "biblioteca dig...
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: 16:32.


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