Newsgroup: it.comp.os.linux.development
Titolo: Select e login

Ciao ragazzi,
ho un piccolo programma che gestisce dei socket tramite una select che 
dovrebbe chiedere l'immissione di username e password, al momento della 
connessione. Tutto rigorosamente non bloccante.
Sapete dirmi come fare?
Grazie

 Sapete dirmi come fare?
primaa di tutto:
man select
man read
man socket
man accept
poi:
main(){
    int fd;
    int client;
    fd_set rfds;
    int ret;
    fd = select(...)
    bind(fd)
    while(shutdown){
        FD_ZERO(&rfds);
        FD_SET(fd, &rfds);
        if (client>0)
            FD_SET(fd, &rfds);
        retval = select(fd+1, &rfds, NULL, NULL, &tv);
 
        if (retval == -1)
           perror("select()");
        else if (retval){
            if ( FD_ISSET(0, &rfds) ){
                client = accept(fd);
            }
            else (FD_ISSET(client, &rfds)){
 
                read(client)
                /*
                codice per vedere la username e password
                */
            }
 
        }
        else
           printf("No data within five seconds.\
 
    }
}

 la select è fata apposta per quelle bloccanti.
Io credo che intendesse che il sistema non deve essere bloccante in
nessuna fase, non che i sockets abbiano settato l' opzione O_NONBLOCK.
Ieri stavo per rispondere, ma avendo scritto una cosa troppo confusa ho
rinunciato. Se ho capito bene nel ciclo di select() che amministra piu'
SocketDescriptor, allo sblocco di alcuni su deve passare alla fase di
autenticazione per alcuni degli sbloccati non ancora auth e fase dati
per altri. Quindi chiede come fare per trasmettere "Login: " e leggere
username e trasmettere "Password: " e leggere la password in modo non
bloccante PER IL CICLO DI SELECT! (cioe' poter leggere/scrivere in tempi
certi e non dipendenti dalla velocita' di trasmissione della stazione
remote anche gli altri Socketdescriptor.)
Non e' un problemino da poco, almeno per me. Io l' ho affrontato scrivendo
un Multiplexer, cioe' ad ogni ciclo di select si scrivono tutti gli
scrivibili e si leggono tutti i leggibili una sola volta, si attivano
i relativi handlers (che potrebbero essere ottenuto con puntatori a
funzioni in un array con indice appunto FD) che dovranno essere scritti
come "produttori/consumatori". Tra l' altro con select() e' d' obbligo
usare IO NON bufferizzato e quindi non e' detto che con una read() non
si legga solo "miouser" con altre "name\nmiapassw" e con altra "ord\n"
Quindi tutta la programmazione degli handlers sara' condizionata dal fatto
che ' elaborazione dei dati deve essere interrompibile e i dati prima
ricostruiti.
Recentemente ho fatto un bot (rob-bot su savannah) che e' solo un framework
per per programmare ad eventi. E' stritto in Perl, ma sicuramente e' da
preferire POE. La strategia e' quella di mettere il consumatore in un
processo separato collegato con sun socketpair che dovra' essere gestito
anch' esso dalla select() e ovviamente distinto dalle connessioni.
Altrimenti altra strategia e' che l' handler interrompa l' elaborazione
dell' input fino all' acquisizione di altro input dopo il prossimo ciclo
di select.
Forse, come POE per Perl o Twistedmatrix per Python si possono trovare
altri frameworks per supportare questo tipo di programmazione senza
rifare tutto a basso livello.
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 rifare tutto a basso livello.
sicuramente.
tipo ho visto ieri che le QT hanno anche tutto il necessario per farsi un
miniserver (anche senza usare interfacia grafica).
glib anche.
ci sarebbe da capire poi a cosa si vuole arrivare... Si potrebbe
appoggiarsi a pam, smanettare in jabberd.
ce ne sono un sacco di cose già fatte.
:)
ciaz

 rifare tutto a basso livello.
In C++ dalla regia dicono ACE. Immagino che ce la si potrebbe cavare...
Se no in ObjectiveC il linguaggio fornisce direttamente il supporto
nella libreria standard. Io lo usai su dei pipe (NSPipe), ma non vedo
perchè non dovrebbero funzionare anche con dei "socket" (NSConnection, a
più alto livello in realtà).
-- 
L'idiozia trascende il mezzo con cui viene espressa.

 In C++ dalla regia dicono ACE. Immagino che ce la si potrebbe cavare...
ACE è il male.
io lo sconsiglio
da noi ci siamo trovati malissimo.
diceva di essere multipiattaforma e nn lo era.
diceva di essere sia a basso livello che ad alto.. e nn funzionava.
è pensato in modo complicato.
ha solo portato noie.
c'è sempre la possibilità che noi nn fossimo capaci... pero'.
io lo sconsiglio.
ci sono un sacco di alternative + snelle. sia ad alto che a basso livello.
ciaz!

 basso livello.
Qualche nome?
Io personalmente in genere vado di twisted, ma alle volte sono ancorato
al C++.
