|
|
|
|
Strumenti |
16-02-2009, 00:57 | #1 |
Senior Member
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2985
|
[C] Aiutino veloce con i socket in Unix
Ciao a tutti!
Ho realizzato un applicazione secondo un modello client/server utilizzando i socket messi a disposizione in unix dalla socket.h Le connessioni riesco a gestirle tranquillamente, ma vorrei sapere se c'è qualche modo "standard" per accorgersi che un client connesso al server ha un crash o viene chiuso forzatamente. Nello specifico:
Come faccio a far capire al server se il client viene chiuso (ad esempio) con CTRL+C? Per caso il segnale SIGINT prodotto da CTRL+C viene letto dalla fgets() e inviato sul socket? Se fosse così la fgets() cosa leggerebbe? BYEZZZZZZZZ!!!!!!!!!!!
__________________
Asus Prime X570-PRO|AMD Ryzen 9 5950X|G.Skill Trident Z Neo 64GB DDR4 3600MHz CL16|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power Pro 11 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
|
16-02-2009, 06:33 | #2 |
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
puoi gestire i segnali (signals) e tentare di mandare un messaggio al server se la connessione è aperta.
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt. |
16-02-2009, 10:44 | #3 |
Senior Member
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2985
|
L'idea che mi era venuta era quella di far mandare dal client un messaggio periodico al server per segnalargli che era ancora connesso. Solo integrare questa soluzione nel progetto mi comporterebbe più di qualche modifica.
Per questo chiedevo se ci fosse qualche soluzione più immediata. Il segnale prodotto da tastiera (in questo caso CTRL+C) causa la chiusura del client... come faccio a catturarlo e a inviarlo al server? BYEZZZZZZZ!!!!!!!
__________________
Asus Prime X570-PRO|AMD Ryzen 9 5950X|G.Skill Trident Z Neo 64GB DDR4 3600MHz CL16|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power Pro 11 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
|
16-02-2009, 10:57 | #4 | |
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
Quote:
http://digilander.libero.it/uzappi/C...ni/signal.html questo ti permette di notificare correttamente al server in caso di chiusura pulita. la tua soluzione con un messaggio keep alive ti risolverebbe il caso in cui un client va in crash pesante o rimane senza connessione internet.
__________________
ho concluso con: kvegeta, doctordb, Leland Gaunt. |
|
16-02-2009, 11:02 | #5 |
Senior Member
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2985
|
Grazie mille!
Credo di riuscire a risolvere facilmente in questo modo! BYEZZZZZZZZZ!!!!!!!!
__________________
Asus Prime X570-PRO|AMD Ryzen 9 5950X|G.Skill Trident Z Neo 64GB DDR4 3600MHz CL16|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power Pro 11 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
|
16-02-2009, 11:08 | #6 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53967
|
Quote:
Quote:
http://www.gnu.org/software/libtool/...n-Example.html Il segnale di CTRL+C è appunto SIGINT. In ogni caso puoi usare anche un timeout sulla recv: Codice:
{ /* this block is just after the return from the socket() call and before connect() */ struct timeval tv; /* timeval and timeout stuff added by davekw7x */ int timeouts = 0; tv.tv_sec = 3; tv.tv_usec = 0; if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv)) { perror("setsockopt"); return -1; } if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof their_addr) == -1) { perror("connect"); exit(1); } while (((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) && (++timeouts < 1000)) { /* loop to retry in case it timed out; added by davekw7x */ perror("recv"); printf("After timeout #%d, trying again:\n", timeouts); } printf("numbytes = %d\n", numbytes); buf[numbytes] = '\0'; printf("Received: %s",buf); } |
||
16-02-2009, 13:19 | #7 |
Senior Member
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2985
|
Grazie cionci.
Il timeout non posso usarlo perchè la receive è in attesa di un input dall'utente. Comunque con la gestione dei segnali dovrei sistemare. BYEZZZZZZZZZZ!!!!!!!!
__________________
Asus Prime X570-PRO|AMD Ryzen 9 5950X|G.Skill Trident Z Neo 64GB DDR4 3600MHz CL16|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power Pro 11 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
|
16-02-2009, 13:28 | #8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53967
|
|
16-02-2009, 13:56 | #9 |
Senior Member
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2985
|
No, ti spiego...
Ho il server che all'avvio crea un pool di thread e un socket di ascolto. Quando riceve una richiesta di connessione, la accetta e passa la gestione ad uno dei thread creati che la gestirà tramite un socket di connessione. Quel thread non ha altri compiti da gestire se non quello di dialogare col client al quale si è connesso. Se l'utente del client impiega 10 minuti ad inviare i dati, il thread può restare bloccato sulla receive per 10 minuti senza problemi. Non ho necessità di liberare risorse per gestire altre connessioni. Quelle che sono attive hanno la precedenza sulle altre in arrivo, che resteranno in attesa che uno dei thread si liberi. BYEZZZZZZZZZ!!!!!!
__________________
Asus Prime X570-PRO|AMD Ryzen 9 5950X|G.Skill Trident Z Neo 64GB DDR4 3600MHz CL16|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power Pro 11 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
|
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:14.