| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  08-11-2006, 15:19 | #1 | 
| 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? | 
|   |   | 
|  08-11-2006, 16:22 | #2 | 
| Senior Member 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 | 
|   |   | 
|  25-02-2007, 15:27 | #3 | |
| Senior Member Iscritto dal: Mar 2005 Città: ~ 
					Messaggi: 740
				 | Quote: 
 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)); ... 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. | |
|   |   | 
|  26-02-2007, 09:46 | #4 | |||
| Senior Member Iscritto dal: Apr 2000 Città: Roma 
					Messaggi: 15625
				 | Quote: 
 Quote: 
 La notifica è stata effettuata con successo, recv==0 vuol dire EOF (nel caso dei socket, disconnessione). 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. 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. | |||
|   |   | 
|  26-02-2007, 10:15 | #5 | 
| 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.
		 | 
|   |   | 
|  26-02-2007, 10:22 | #6 | 
| Senior Member Iscritto dal: Apr 2000 Città: Roma 
					Messaggi: 15625
				 | 
		
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 | 
|   |   | 
|  26-02-2007, 10:38 | #7 | |
| Bannato Iscritto dal: Feb 2005 Città: Roma 
					Messaggi: 7029
				 | Quote: 
   | |
|   |   | 
|  26-02-2007, 13:42 | #8 | |
| Senior Member Iscritto dal: Apr 2000 Città: Roma 
					Messaggi: 15625
				 | Quote: 
 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 | |
|   |   | 
|  26-02-2007, 15:39 | #9 | ||
| Senior Member Iscritto dal: Mar 2005 Città: ~ 
					Messaggi: 740
				 | Quote: 
 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: 
   è 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. | ||
|   |   | 
|  26-02-2007, 21:21 | #10 | 
| 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)   | 
|   |   | 
|  27-02-2007, 17:01 | #11 | |
| Senior Member 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: 
   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 | |
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 15:20.









 
		 
		 
		 
		









 
  
 



 
                        
                        










