|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
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 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 |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
Quote:
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 |
|
|
|
|
|
|
#3 |
|
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()?
|
|
|
|
|
|
#4 |
|
Senior Member
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.
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
Quote:
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. |
|
|
|
|
|
|
#6 | |
|
Member
Iscritto dal: Jan 2006
Messaggi: 271
|
Quote:
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? |
|
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
Quote:
Quote:
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 |
||
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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 |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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 |
|
|
|
|
|
#10 | |
|
Member
Iscritto dal: Jan 2006
Messaggi: 271
|
Quote:
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. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
Quote:
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 |
|
|
|
|
|
|
#12 |
|
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. |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Riccione
Messaggi: 1851
|
Quote:
__________________
Visitate il mio blog sul mondo FPV:HeavyMachineGun Per i veri appassionati di Formula1: PassioneF1 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:59.



















