Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-02-2009, 01:57   #1
Zak84
Senior Member
 
L'Avatar di Zak84
 
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2990
[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:
  • Ho il server in attesa su una recv()
  • Il client è in attesa di dati in input tramite una fgets() che invierà successivamente al server tramite una send()

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 X670E-PRO WIFI|AMD Ryzen 7 7800X3D|G.Skill Trident Z Neo 64GB DDR5 6000MHz CL30|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power 13 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
Zak84 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 07:33   #2
vizzz
Senior Member
 
L'Avatar di vizzz
 
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.
vizzz è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 11:44   #3
Zak84
Senior Member
 
L'Avatar di Zak84
 
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2990
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 X670E-PRO WIFI|AMD Ryzen 7 7800X3D|G.Skill Trident Z Neo 64GB DDR5 6000MHz CL30|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power 13 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
Zak84 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 11:57   #4
vizzz
Senior Member
 
L'Avatar di vizzz
 
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
Quote:
Originariamente inviato da Zak84 Guarda i messaggi
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!!!!!!!
http://linux.die.net/man/2/signal
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.
vizzz è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 12:02   #5
Zak84
Senior Member
 
L'Avatar di Zak84
 
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2990
Grazie mille!
Credo di riuscire a risolvere facilmente in questo modo!

BYEZZZZZZZZZ!!!!!!!!
__________________
Asus Prime X670E-PRO WIFI|AMD Ryzen 7 7800X3D|G.Skill Trident Z Neo 64GB DDR5 6000MHz CL30|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power 13 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
Zak84 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 12:08   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Zak84 Guarda i messaggi
L'idea che mi era venuta era quella di far mandare dal client un messaggio periodico al server per segnalargli che era ancora connesso.
Questo è un cosiddetto keep-alive...è va benissimo.
Quote:
Originariamente inviato da Zak84 Guarda i messaggi
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?
Puoi catturare la chiusura dell'applicazione tramite CTRL+C ed inserire un gestore personalizzato del segnale prima di uscire (ad esempio che fa la chiusura della connessione).

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);
        }
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 14:19   #7
Zak84
Senior Member
 
L'Avatar di Zak84
 
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2990
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 X670E-PRO WIFI|AMD Ryzen 7 7800X3D|G.Skill Trident Z Neo 64GB DDR5 6000MHz CL30|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power 13 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
Zak84 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 14:28   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Zak84 Guarda i messaggi
Il timeout non posso usarlo perchè la receive è in attesa di un input dall'utente.
Cosa intendi ? Lo so che sei in attesa di un input dall'utente, ma se questo utente sta fermo per 5 minuti è giusto che tu termini la sessione.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 14:56   #9
Zak84
Senior Member
 
L'Avatar di Zak84
 
Iscritto dal: Dec 2001
Città: Fondi - LT -
Messaggi: 2990
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 X670E-PRO WIFI|AMD Ryzen 7 7800X3D|G.Skill Trident Z Neo 64GB DDR5 6000MHz CL30|nVidia GeForce RTX 4090 Founders Edition|Samsung 980 Pro 1TB|Samsung 980 Pro 2TB|Creative Sound BlasterX AE5-Plus| BeQuiet! Dark Power 13 850W|Noctua NH-D15S| BeQuiet! Silent Base 801
Zak84 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
MrBeast entra nel fintech: Beast Industr...
Arrivano i nuovi server Bare Metal 2026 ...
Stop alla distribuzione dei driver di st...
Serie TV God of War: scelto anche l'atto...
Riot Games dimezza il team di 2XKO dopo ...
FRITZ! in super offerta su Amazon: ripet...
L'AI doveva farci lavorare meno: e se st...
DREAME X50 Ultra Complete a 899€ su Amaz...
Rimodulazione TIM: aumenti fino a 2,99 e...
Amazon sblocca i prezzi con coupon e sco...
Action cam Insta360 in super offerta su ...
Fallout 76 Sorgenti Brucianti: tanta car...
Scope elettriche super potenti a confron...
Tutti i Google Pixel 10 sono scontati su...
Report Legambiente 2025: Palermo, Milano...
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: 13:02.


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