Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    182

    [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

  2. #2
    Il consiglio che do sempre in questi casi è quello di non fare questo genere di cose a mano.
    La programmazione con socket non bloccanti è estremamente complessa e soggetta ad errori, anche solo senza mettere in ballo il discorso di portabilità tra differenti piattaforme.
    La cosa migliore da fare in questi casi è appoggiarsi ad un framework di rete asincrono al cui interno sono gia risolti tutti i problemi che tu potresti incontrare facendo tutto a mano.
    Fare questo genere di cose da sè porta allo sviluppo di accrocchi buggati che nel giro di poco tempo ti crollano tra le mani come un castello di carte.
    Dai un occhio a questa discussione in cui l'argomento è gia stato trattato:
    http://forum.html.it/forum/showthrea...ight=framework
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    182
    Posso essere più o meno d'accordo col tuo consiglio, ma coloro che hanno sviluppato i framework avranno dovuto imparare come funzionano i socket ai livelli più bassi. Se a tutti gli sviluppatori dici "usa i framework" alla fine non ci saranno più persone che creano i framework stessi.

    Ad ogni modo se mi voglio facilitare la vita posso usare i framework ma probabilmente non capirò e e non imparerò i socket a fondo. Posso avere mille motivazione per programmare a livelli più bassi: voglia di imparare, sviluppo framework, logica dei socket, masochismo... non è questo il punto!

    Io posso voler sviluppare un piccolissimo software (come quello che ho descritto). Che importanza ha se è pieno di bug? Non per forza devo metterlo sul mercato, ma può servirmi a me per imparare e migliorare il codice.

    Rilancio la domanda.

  4. #4
    Devi usare il multiplexing.
    Utilizzando select, o poll, setti un timeout sul file descriptor, cosi la connessione viene chiusa dopo tot secondi.
    Vedi qua:
    http://beej.us/guide/bgnet/output/ht...ed.html#select
    Se vuoi veramente imiparare ti consiglio un libro:
    http://www.libreriauniversitaria.it/.../9780131411555




Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.