Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 04-08-2008, 18:52   #1
bouncey2k
Member
 
Iscritto dal: Jan 2006
Messaggi: 271
[C] socket non bloccante

Ho scoperto da poco che il socket di default (almeno sotto unix) è bloccante, sto cercando di risolvere il problema con
Codice:
fcntl(sd,F_SETFL,O_NONBLOCK);
senza risultati positivi.

Senza stare a postare tutto il codice vi riassumo il tutto:

creo il socket sd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
lo rendo non bloccante con l'istruzione sopracitata e mi connetto ad un server.

Dopodiché invio e ricevo un messaggio con send() e recv(). Tutto liscio: mando e ricevo il messaggio di risposta dal server.

A questo punto, avendo reso il socket non bloccante, dovrei essere in grado di mandare e ricevere altri messaggi, invece nulla.

Al secondo recv() che faccio, l'int di recv() mi restituisce 0, segno che la connessione dall'altro lato (server) è chiusa.


Un aiutino?
PS: programmo sotto linux
bouncey2k è offline   Rispondi citando il messaggio o parte di esso
Old 04-08-2008, 19:40   #2
Slayer86
Senior Member
 
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
Quote:
Originariamente inviato da bouncey2k Guarda i messaggi
Ho scoperto da poco che il socket di default (almeno sotto unix) è bloccante, sto cercando di risolvere il problema con
Codice:
fcntl(sd,F_SETFL,O_NONBLOCK);
senza risultati positivi.

Senza stare a postare tutto il codice vi riassumo il tutto:

creo il socket sd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
lo rendo non bloccante con l'istruzione sopracitata e mi connetto ad un server.

Dopodiché invio e ricevo un messaggio con send() e recv(). Tutto liscio: mando e ricevo il messaggio di risposta dal server.

A questo punto, avendo reso il socket non bloccante, dovrei essere in grado di mandare e ricevere altri messaggi, invece nulla.

Al secondo recv() che faccio, l'int di recv() mi restituisce 0, segno che la connessione dall'altro lato (server) è chiusa.


Un aiutino?
PS: programmo sotto linux
Credo, ma non sono sicuro, che il socket non bloccante si riferisca al fatto che la chiamata effettuata sopra di esso non aspetta risposta per terminare ma ritorna appunto 1 se ha successo 0 se falliscie, evitando quindi di bloccare il processo che la esegue.
Nel tuo caso è infatti così, la seconda chiamata ritorna 0 mentre la prima viene eseguita, questo perchè la porta associata al socket è occupata!!!
Spero di essere stato chiaro...
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun
Per i veri appassionati di Formula1: PassioneF1
Slayer86 è offline   Rispondi citando il messaggio o parte di esso
Old 04-08-2008, 19:51   #3
bouncey2k
Member
 
Iscritto dal: Jan 2006
Messaggi: 271
Parli della porta del client o del server? Come è possibile che sia occupata se ho usato solo due comandi send() e recv()?
bouncey2k è offline   Rispondi citando il messaggio o parte di esso
Old 04-08-2008, 20:21   #4
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
La caratteristica "non bloccante" si riferisce proprio alla recv. La recv in un socket normale se non arrivano dati resta in attesa dell'arrivo. In un socket non bloccante la recv ritorna subito 0 se non ci sono dati pronti per la lettura.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-08-2008, 22:32   #5
Slayer86
Senior Member
 
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
Quote:
Originariamente inviato da cionci Guarda i messaggi
La caratteristica "non bloccante" si riferisce proprio alla recv. La recv in un socket normale se non arrivano dati resta in attesa dell'arrivo. In un socket non bloccante la recv ritorna subito 0 se non ci sono dati pronti per la lettura.
Giustooo cionci ha sempre ragione!
Ho detto in parte una castroneria... se avesse letto il mio prof di reti di calcolatori mi toglieva il voto e mi costringeva a ridare l'esame!!!
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun
Per i veri appassionati di Formula1: PassioneF1

Ultima modifica di Slayer86 : 04-08-2008 alle 22:36.
Slayer86 è offline   Rispondi citando il messaggio o parte di esso
Old 04-08-2008, 23:05   #6
bouncey2k
Member
 
Iscritto dal: Jan 2006
Messaggi: 271
Quote:
Originariamente inviato da cionci Guarda i messaggi
La caratteristica "non bloccante" si riferisce proprio alla recv. La recv in un socket normale se non arrivano dati resta in attesa dell'arrivo. In un socket non bloccante la recv ritorna subito 0 se non ci sono dati pronti per la lettura.
Scusa ma non è l'inverso? In un socket normale (bloccante) se la recv() non riceve dati la comunicazione si chiude. Sennò che senso avrebbe fare un socket non-bloccante?

Ad ogni modo come faccio a fare in modo che il mio client usi più recv() durante la stessa connessione senza che questa venga chiusa?
bouncey2k è offline   Rispondi citando il messaggio o parte di esso
Old 04-08-2008, 23:26   #7
Slayer86
Senior Member
 
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
Quote:
Originariamente inviato da bouncey2k Guarda i messaggi
Scusa ma non è l'inverso? In un socket normale (bloccante) se la recv() non riceve dati la comunicazione si chiude. Sennò che senso avrebbe fare un socket non-bloccante?

Ad ogni modo come faccio a fare in modo che il mio client usi più recv() durante la stessa connessione senza che questa venga chiusa?
questo è ciò che riportano le slide su cui a suo tempo ho studiato ti serve per capire cosa significa bloccante:
Quote:
Letture/scritture bloccanti
Le operazioni di lettura e scrittura che abbiamo definito sono bloccanti:
• Per una operazione di lettura cio' significa che
• Se non ci sono dati disponibili nel buffer di ricezione del socket al
momento dell'invocazione dell'operazione, il processo chiamante
si blocca in attesa che dei dati diventino disponibili.
• Quando i dati diventano disponibili la system call termina, e i dati
a quel punto disponibili vengono ritornati al chiamante.
• Per una operazione di scrittura cio' significa che
• Se nel buffer di trasmissione del socket non c'e' spazio di
memoria per ospitare i dati (ad es. perche' la rete e' piu' lenta a
consumare dati di quanto sia il processo a produrli), il processo
si blocca in attesa che tale spazio diventi disponibile.
• Quando c'e' spazio disponibile l'esecuzione della system call
riprende: tutti i dati che possono essere copiati nel socket
(perche' c'e' abbastanza spazio) lo sono, e l'operazione termina.
se un'operazione non è bloccante significa che il processo che la esegue non si ferma ad aspettare il risultato... nel caso della recv() non bloccante se non c'è scritto nulla sul socket la recv() non si ferma ad aspettare ma ti avvisa che non ha letto nulla...

non capisco cosa intendi dire con usare più recv()... così su due piedi mi pare che a te serva un socket bloccante come nella maggior parte dei casi!
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun
Per i veri appassionati di Formula1: PassioneF1
Slayer86 è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2008, 09:37   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da cionci Guarda i messaggi
La caratteristica "non bloccante" si riferisce proprio alla recv. La recv in un socket normale se non arrivano dati resta in attesa dell'arrivo. In un socket non bloccante la recv ritorna subito 0 se non ci sono dati pronti per la lettura.
No ritorna -1 con errno=EAGAIN. Il problema è da un'altra parte...
__________________
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 05-08-2008, 09:39   #9
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da bouncey2k Guarda i messaggi
creo il socket sd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
lo rendo non bloccante con l'istruzione sopracitata e mi connetto ad un server.
Stai attento che se rendi il socket non bloccante prima della connect, la connect stessa è non bloccante.
__________________
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 05-08-2008, 14:52   #10
bouncey2k
Member
 
Iscritto dal: Jan 2006
Messaggi: 271
Quote:
Originariamente inviato da Slayer86 Guarda i messaggi
non capisco cosa intendi dire con usare più recv()... così su due piedi mi pare che a te serva un socket bloccante come nella maggior parte dei casi!
Per usare più recv() intendo il seguente codice:

CLIENT
send(arg) --> server
recv(arg) <-- server

send(arg2) --> server
recv(arg2) <-- server

Cioè ad ogni messaggio che mando al server, quello mi risponde, e i messaggi vengono mandati uno dopo l'altro, botta e risposta.

Se il socket è BLOCCANTE il primo recv() lo ricevo e il secondo recv() mi restituisce 0, connessione interrotta.
Se metto il socket NON BLOCCANTE (anche dopo la connect()) mi restituisce 0 direttamente alla prima recv().

Ultima modifica di bouncey2k : 05-08-2008 alle 14:54.
bouncey2k è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2008, 15:13   #11
Slayer86
Senior Member
 
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
Quote:
Originariamente inviato da bouncey2k Guarda i messaggi
Per usare più recv() intendo il seguente codice:

CLIENT
send(arg) --> server
recv(arg) <-- server

send(arg2) --> server
recv(arg2) <-- server

Cioè ad ogni messaggio che mando al server, quello mi risponde, e i messaggi vengono mandati uno dopo l'altro, botta e risposta.

Se il socket è BLOCCANTE il primo recv() lo ricevo e il secondo recv() mi restituisce 0, connessione interrotta.
Se metto il socket NON BLOCCANTE (anche dopo la connect()) mi restituisce 0 direttamente alla prima recv().
Bhe guarda secondo me il socket deve essere bloccante per quello che ti serve...
tu fai la send e poi subito una recv() in modo che il client si blocca ad aspettare che arrivi la risposta del server...

Poi tutto dipende da come è fatto il server... sei sicuro che gestisca per bene le richieste che gli arrivano e non si chiuda dopo una sola risposta?
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun
Per i veri appassionati di Formula1: PassioneF1
Slayer86 è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2008, 16:59   #12
bouncey2k
Member
 
Iscritto dal: Jan 2006
Messaggi: 271
Allora ho fatto ancora quale prova.
Non ho impostato particolari caratteristiche al socket, percui di defaul è bloccante.

Il server non l'ho fatto io, è un server per chat ed usa un protocollo proprietario, ad ogni modo conosco il protocollo e le prime istruzioni sono varie recv() e send(), cioè riceve il messaggio dal client e mi risponde se è OK o no per circa 3-4 volte.

Mando un send() al server e ricevo con recv() la risposta, tutto ok.
Mando un secondo send() al server ricevo una risposta vuota, analizzo l'int della recv() ed è 0.

Per curiosità decido di sniffare il traffico con wireshark per vedere che succede.
Come riesco a notare mando la prima send() correttamente e ricevo la recv() correttamente.
Mando correttamente anche la seconda send(), ma quando dovrei ricevere la seconda recv() ecco che vedo un bel [FIN, ACK] mandato dal server ed un altro bel [FIN, ACK] mandato dal mio client come risposta.
bouncey2k è offline   Rispondi citando il messaggio o parte di esso
Old 05-08-2008, 18:15   #13
Slayer86
Senior Member
 
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
Quote:
Originariamente inviato da bouncey2k Guarda i messaggi
Allora ho fatto ancora quale prova.
Non ho impostato particolari caratteristiche al socket, percui di defaul è bloccante.

Il server non l'ho fatto io, è un server per chat ed usa un protocollo proprietario, ad ogni modo conosco il protocollo e le prime istruzioni sono varie recv() e send(), cioè riceve il messaggio dal client e mi risponde se è OK o no per circa 3-4 volte.

Mando un send() al server e ricevo con recv() la risposta, tutto ok.
Mando un secondo send() al server ricevo una risposta vuota, analizzo l'int della recv() ed è 0.

Per curiosità decido di sniffare il traffico con wireshark per vedere che succede.
Come riesco a notare mando la prima send() correttamente e ricevo la recv() correttamente.
Mando correttamente anche la seconda send(), ma quando dovrei ricevere la seconda recv() ecco che vedo un bel [FIN, ACK] mandato dal server ed un altro bel [FIN, ACK] mandato dal mio client come risposta.
Secondo me o sbagli qualche cosa con il protocollo oppure è fatto male il server!
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun
Per i veri appassionati di Formula1: PassioneF1
Slayer86 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Il remake di Assassin's Creed IV: Black ...
Tutti i robot aspirapolvere in offerta s...
Amazon Haul spinge la promo di San Valen...
Offerte hardware Amazon per l'upgrade de...
iPhone 17e dovrà fare i conti con...
Offerte Amazon sugli iPhone di ultima ge...
DJI Mini 5 Pro Combo Fly More scende a 8...
Ubisoft potrebbe licenziare ancora ma se...
Samsung Galaxy S26: un leak anticipa col...
Aetherflux e Lockheed Martin insieme per...
SpaceX sta proseguendo i test della terz...
Axiom Space ha mostrato un nuovo video d...
Realme: la trasformazione in sub-brand d...
PlayStation 6 si farà attendere: ...
BWT Alpine chiude la prima tornata di pr...
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: 21:59.


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