Programmatori Linux o aspiranti: ecco il mattone per voi!

Sun Jul 22 08:01:56 CEST 2007

Sun Jul 22 08:01:56 CEST 2007 jackal@slack
Bazzicavo in giro... e' da una vita che penso di dover leggere qlcosa sulle socket su cui ho solo idee nebulose... ed ho trovato LA guida. Non un tutorial-howto icsipsilon, ma qualcosa di simile al mattone di Tanenbaum :D IN ITALIANO :love: Per me c'e' il capitolo sulla programmazione di rete, ma in realta' e' un pdf enciclopedico di nome GaPiL Guida alla Programmazione in Linux ecco il link :!: [url:2kb432vz]http://zefiro.bo.ismar.cnr.it/SMB/SRV/DOCUMENTATION/manuals/linux/Linux_Documentation_Project/GAPIL/gapil_marzo2005.pdf[/url:2kb432vz] (ah sono 6,7 Mb di pidieffe :mrgreen:) EDIT: ho trovato il link del progetto ufficiale, all'interno del sito c'e' anche la versione online, che non e' minimamante attraente come il pdf, ma se siete solo vagamente curiosi potete intanto buttare l'occhio: [url:2kb432vz]http://gapil.truelite.it/[/url:2kb432vz]
Sun Jul 22 09:28:44 CEST 2007 peoro
Il GAPIL lo conosco da almeno 4 anni, quando me lo stampai anche... La trovai veramente splendida all'inizio, fantastica, era la mia bibbia, poi pero' iniziai a sentire la mancanza di qualche parte... Non accenna nemmeno i pthreads (e quindi a qualche serie di funzioni relative, tipo i mutex) e questa e' la mancanza piu' rilevante, poi presenta tutte le funzioni di polling tranne la epoll, non menziona le api dlopen e dice abbastanza cose poche su argomenti anche importanti (ad esempio parla pochissimo dei sockets non bloccanti). Ma dopotutto e' il riassunto di sette libri grosse come case, nessuno potrebbe scrivere mai abbastanza, e per imparare come usare i sockets quella guida e' meravigliosa. Ormai ho abbandonato quella roba: gestire qualcosa (anche solo i sockets) solo con le funzioni posix e' durissimo e non portabile su sistemi operativi malvagi (aka non-posix), uso solo librerie che s'astraggano tutta la roba sulla rete, sui threads, sui processi, sul filesystem, e mi forniscano tutto in maniera molto piu' semplice, magari ad oggetti per il C++ e portabile, tipo i moduli Core (che comprende FS, threads, processi, ...) e Network delle Qt...
Sun Jul 22 10:33:13 CEST 2007 CoD
Peoro e' un maestro... :shock: e non solo per la professionalita' con cui ha risposto, ma anche per come ha risposto:
peoro
e dice abbastanza cose poche
vedete? Parla proprio come il maestro Yoda :mrgreen:
Sun Jul 22 14:32:05 CEST 2007 peoro
[img:25c90n33]http://www.marmotta.ch/faccine/z012-malol.gif[/img:25c90n33] Ogni tanto modifico un po' cio' che scrivo, ma le nuove parole che aggiungo non vanno sempre nel posto giusto [img:25c90n33]http://www.marmotta.ch/faccine/stordita.gif[/img:25c90n33]
Sun Jul 22 16:24:30 CEST 2007 jackal@slack
uau peoro, grazie per questa risposta! Uhm allora posso chiederti che libreria mi consiglieresti da nubbo totale? Pensavo di fare le prime prove (se mai le faccio) con una specie di echo server/client, o magari anche meno. Somma cazzate al di sopra del tcp/ip. Sperando che sia ben documentata :D
Sun Jul 22 16:47:16 CEST 2007 Slux
io invece sono abituato, e mi hanno insegnato a scrivere codice POSIX C! Punto a basta! 8)
Sun Jul 22 17:00:37 CEST 2007 peoro
jackal@slack
uau peoro, grazie per questa risposta! Uhm allora posso chiederti che libreria mi consiglieresti da nubbo totale? Pensavo di fare le prime prove (se mai le faccio) con una specie di echo server/client, o magari anche meno. Somma cazzate al di sopra del tcp/ip. Sperando che sia ben documentata :D
Se ti va di imparare e usare il C++ ti consiglio tantissimo le Qt4. A differenza delle versioni precedenti sono indipendenti dalle QtGui (quindi dal server X) e per questo sono adatte anche per server. Un echo server / client come quello che insegna come fare il Gapil lo fai in meno di 10 linee di codice... Se usi il C non saprei proprio, ce ne sono migliaia ma non le ho mai usate: ho abbandonato le funzioni posix quando ormai usavo il C++.
Slux
io invece sono abituato, e mi hanno insegnato a scrivere codice POSIX C! Punto a basta! 8)
Uh, che bravo, vai, dimmi un po' come fare per cambiare il timeout della connect (che di default e' 30 secondi). Poi gia' che ci sei dimmi come farlo portabile in modo che vada su uindou. O gia' che ci sei mostrami quant'e' facile gestire tanti socket con la poll. Poi se vuoi ti mostro come fare cio' che ho menzionato con le Qt.
Sun Jul 22 17:26:22 CEST 2007 Slux
non ho detto infatti che faccio per la portabilita' :) e nemmeno ho menzionato poll ecc... Che nerd che sei! :lol:
Sun Jul 22 18:44:00 CEST 2007 jackal@slack
da parte mia, grazie a tutti e due :) Ora passiamo alla comicita' della scenetta:
Slux
[...] scrivere codice POSIX C! Punto a basta! 8)
peoro
Poi se vuoi ti mostro come fare cio' che ho menzionato con le Qt.
Dal look che proponete, Slux e' il Stallman della situazione, peoro invece fa il Torvalds incravattato (ma con le maniche rialzate) che va a mediare con aziende :lol: Beh dai su raga.. io devo solo fare stronzatine, mica 'na laurea! Di poll ne faccio solo nei forums :lol: (peoro sto schersando, grazie per le precisazioni!)
Sun Jul 22 19:37:34 CEST 2007 peoro
Slux
non ho detto infatti che faccio per la portabilita' :) e nemmeno ho menzionato poll ecc... Che nerd che sei! :lol:
Quindi lo usi solo per fare cavolatine, e non per scopi seri, ah, beh, allora ok... Io per quello uso Netcat su SH, e se proprio non mi basta al limite il Python... Che bisogno c'e' di scomodare il C per cose simili? [img:396en8ca]http://www.marmotta.ch/faccine/madai.png[/img:396en8ca] Se lo fai per divertimento fai benissimo, ovviamente. Anche a te, jackal ti consiglio di guardarti come funziona la roba posix, ci impari molto (o almeno a me e' servito un sacco), ma quando/se avrai intenzioni serie... Beh, proprio no. Gli unici progetti su cui ha senso usare le funzioni posix sono quelli VERAMENTE grossi, a livello commerciare, che so', Apache, che ovviamente sara' malto piu' libero usando le Posix. Il codice da scrivere sara' il triplo, ma, beh, stiamo parlando di Apache... jackal@slack vuoi qualche esempietto con le Qt4? Vediamo... Vuoi creare un bel server TCP? Basta che ti erediti la classe QTcpServer, quindi overloadi la funzione "void incomingConnection(int sd);" che verra' richiamata quando qualcuno si connette (sd sara' il file descriptor del socket connesso, ovviamente) e potrai farci cio' che vuoi: [code:396en8ca]class Server : public QTcpServer { Q_OBJECT public: Server( ) { // ascolto sulla porta 1234, verso qualsiasi indirizzo listen( QHostAddress::Any, 1234 ); } void incomingConnection( int sd ) { // sd si e' appena connesso :O } };[/code:396en8ca] E fra l'altro la listen di default non e' bloccante: mentre il server ascolta una connessione te puoi continuare a fare cio' che vuoi pur rimanendo in ascolto. Se vuoi che sia bloccante puoi farlo senza problemi, ti basta usare la waitForNewConnection() sul tuo oggetto, la quale accetta anche come parametro un timeout (puo' stare in ascolto finche' non riceve una connessione, come la listen posix, o smettere quando il timeout che gli specifici, se lo specifici, scade) Se non hai voglia di ereditare la classe per sovrascrivere la incomingConnection() ti basta collegare un tuo slot al segnale newConnection(). Vuoi connetterti te ad un server? Basta che chiami la connectToHost su un QTcpSocket: [code:396en8ca]QTcpServer socket; socket.connectToHost( "www.tremulous.it", 80 );[/code:396en8ca] e da solo lui risolve l'hostname e si connette. Pure questa funzione e' non bloccante di default, se lo vuoi bloccante basta usare la waitForConnected(). Anche questa accetta come parametro il timeout. Quando l'hostname e' risolto ti viene lanciato il segnale hostFound() (che e' abbastanza inutile in genere, a meno che non t'interessi sapere quanto delay hai coi server DNS) quando il socket e' connesso viene lanciato il segnale connected(). Cosa sono i segnali e gli slot che ho menzionato? Sono uno dei cardini su cui si basano le Qt: le classi hanno la possibilita' di lanciare dei segnali e di allacciare a dei segnali (anche non propri) a delle funzioni di callback (chiamate slot). Quando un segnale viene lanciato, le Qt si occupano di richiamare tutti gli slot allacciati a lui. Beh... Ho fatto un paio d'esempi coi socket TCP (vorrei tanto vedere quante centinaia di righe sono richieste per fare la stessa cosa in C con le funzioni posix), ma tutte le classi delle Qt offrono la stessa semplicita' di utilizzo: per eseguire un processo ed aprire una pipe verso di lui ti basta avere un QProcess, usare la sua start("nome_processo") e quindi usare read() e write() su tale processo per leggere e scrivere dalla pipe. Per gestire un thread ti basta ereditare la classe QThread e overloadare la funzione run(), quindi lanciando la exec() sul QThread il nuovo thread viene creato e parte eseguendo la run(). Se volete sapere come fare altre cose con le Qt chiedete... L'unico modulo che non so usare e' il QtGui, quello per le Gui [img:396en8ca]http://www.marmotta.ch/faccine/fagiano.gif[/img:396en8ca].
Sun Jul 22 20:54:34 CEST 2007 El-Mejo
Conoscete qualche guida per la programmazione analoga ma che parta da 0? Basta che non spieghi il visualbasic...