Beej's Guide to Network Programming

Usare gli Internet Socket Luglio 25, 2001
Revision Versione 1.0.0 Agosto, 1995 Revised by: beej
Versione iniziale.
Revision Versione 1.5.5 13 Gennaio, 1999 Revised by: beej
Ultima versione in HTML.
Revision Versione 2.0.0 6 Marzo, 2001 Revised by: beej
Convertita a DocBook XML, correzioni, aggiunte.
Revision Versione 2.0.1 7 Marzo, 2001 Revised by: beej
Correzioni minori.
Revision Versione 2.0.2 16 Marzo, 2001 Revised by: beej
inet_ntoa() avrebbe dovuto essere inet_aton() in alcuni punti.
Revision Versione 2.0.3 2 Aprile, 2001 Revised by: beej
inet_aton() restituisce valori corretti, cambiamenti a selectserver, sistemati dei refusi, aggiunta recvtimeout().
Revision Versione 2.1.0 3 Maggio, 2001 Revised by: beej
Sistemati buffer overruns in client.c e listener.c, server.c elimina gli zombie in maniera massiccia, aggiunta l'email policy.
Revision Versione 2.2.0 24 Giugno, 2001 Revised by: beej
Aggiornate le QnA, Windows, talker.c, PF_INET ,l'esempio di accept() , niente più bzero(), Solaris setsockopt().
Revision Versione 2.2.1 25 Giugno, 2001 Revised by: beej
Aggiornamenti minori alle QnA, aggiunta la roba dell'affiliazione a Amazon.
Revision Versione 2.3.0 25 Luglio, 2001 Revised by: beej
Aggiunti elementi alle QnA, ripulita selectserver.c, aggiunta WSACleanup(), chiarimenti sulla dimensione di struct in_addr.
Revision Versione 2.3.1 8 Ottobre, 2001 Revised by: beej
Corretti refusi, errore di sintassi in client.c, aggiunta un po' di roba alle QA .


Brian "Beej" HallCopyright © "1995-2001"; by Brian "Beej" Hall

La traduzione approssimativa (beta 1) è di Gabriele "loser" Renzi ..sperando che possa esservi utile, l'homepage della traduzione è su
irc.dis.uniroma1.it/~loser, segnalatemi errori etc o mandatemi una mail di insulti, apprezzerò lo stesso :-)

Introduzione

Hey! La programmazione dei socket ti ha buttato giù? Questa roba è appena un po' troppo difficile per comprenderla dalle pagine man? Vuoi fare un po di fichissima programmazione per Internet, ma non hai tempo da perdere in un mare di structs cercando di capire se devi chiamare bind() prima di usare connect(), etc., etc.

Beh,indovina! Io ho già fatto tutto questo lavoraccio, e sto morendo dalla voglia di condividere l'informazione con tutti! Sei venuto nel posto giusto. Questo documento dovrebbe fornire al programmatore C di media competenza quel che gli manca per comprendere tutto questo rumore sulla rete.

Pubblico

Questo documento è stato scritto come un tutorial, non come una guida di riferimento. Probabilmente da il meglio di se quando viene letto da individui che stanno appena cominciando la programmazione dei socket e stanno un primo punto d'appoggio. Certamente non si tratta della guida completa alla programmazione dei socket, in nessun senso.

Comunque, si spera, sarà abbastanza affinchè quelle pagine man comincino ad avere senso... :-)

Piattaforma e compilatore

Il codice contenuto in questo documento è stato compilato su un PC Linux usando il compilatore Gnu gcc. Ad ogni modo, esso dovrebbe girare su praticamente tutte le piattaforme che usano gcc. Naturalmente, questo non si applica se state programmando per Windows-- date un'occhiata alla sezione sulla programmazione per Windows , qui sotto.

Homepage ufficiale

Questa sito ufficiale del documento è alla California State University, Chico, a "http://www.ecst.csuchico.edu/~beej/guide/net/";.

Note per i programmatori Solaris/SunOS

Quando compilate per Solaris o SunOS, avrete bisogno di specificare alcuni parametri da riga di comando in più per link`are le librerie apropriate. Per fare ciò, aggiungete semplicemente "-lnsl -lsocket -lresolv" alla fine del comando di compilazione, così:

    $ cc -o server server.c -lnsl -lsocket -lresolv

Se ottenete ancora errori, potete provare ad aggiungere "-lxnet" alla fine di quella riga di comando. Non so, esattamente, cosa faccia, ma alcune persone sembrano averne bisogno.

Un'altro punto dove potreste trovare problemi è nel chiamare setsockopt(). Il prototipo differisce da quello della mia Linux box, quindi invece di:

       int yes=1;

mettete questo:

       char yes='1';

Siccome non ho una macchina Sun, Non ho test`ato personalmente nessuna delle informazioni precedenti -- è solo quello che mi ha detto la gente via email.

Note per i Programmatori Windows

Ho una particolare avversione per Windows, e vi incoraggio a provare Linux, BSD, o Unix al suo posto. Detto questo, poteta ancora usare questa roba sotto Windows.

Anzitutto, ignorate praticamente tutti i file header di sistema che nomino qui. Tutto ciò dio cui avrete bisogno di includere è :

    #include <winsock.h>

Aspettate! dovrete anche fare una chiamata alla funzione WSAStartup() prima di fare qualunque altra cosa con la libreria dei socket. Il codice per fare ciò è una cosa del genere:

    #include <winsock.h>

    {
        WSADATA wsaData;   // se questo non funziona 
        //WSAData wsaData; // allora provate questo

        if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
            fprintf(stderr, "WSAStartup fallita.\n");
            exit(1);
        }

Dovete anche dire al compilatore di link`are la libreria Winsock, generalmente chiamata wsock32.lib o winsock32.lib o qualcosa del genere. Con VC++, questo può esserefatto atraverso il menu Project, sotto Settings.... Cliccate la tabella Link, e cercate la parte intitolata "Object/library modules". Aggiungete "wsock32.lib" a quella lista .

O almeno così ho sentito dire.

Infine, dovrete chiamare WSACleanup() quando avrete finito con la libreria dei socket. Guardate il vostro aiuto in linea per i dettagli.

Una volta che l'avete fatto, il resto degli esempi in questo tutorial dovrebbe applicarsi, in generale , con alcune eccezioni. Per prima cosa , non potete usare la funzione close() per chiudere un socket--avrete bisogno di usare closesocket(), al suo posto. Inoltre, select() funziona solo con i descrittori di socket, non con i descrittori di file (come 0 per stdin).

C'è anche una classe socket che potreste usare, CSocket. Controllate le pagine d'aiuto dei vostri compilatori per maggiori informazioni.

Per ottenere maggiori informazioni sul Winsock, leggete le Winsock FAQ e andate avanti da li.

infine, ho sentito dire che Windows non ha la chiamata di sistema fork() che, sfortunatamente , viene usata da me in alcuni esempi. Forse dovrete link`are qualche libreria POSIX o qualcos'altro per farla funzionare, o potreste usare al suo posto CreateProcess(). fork() non prende nessun argomento, e CreateProcess() ne prende circa 48 miliardi. Se non vi vadi usare quella CreateThread() è un po meglio da digerire ... sfortunatamente una discussione sul multithreading è oltre la portata di questo documento. Posso dirvi solo questo, capite!

Email Policy

In generale sono disponibile ad aiutarvi con le domande via email quindi sentitevi liberi di scrivermi, ma non posso garantirvi una risposta. Ho una vita impegnata e ci sono volte in cui proprio non posso rispondervi. Quando ciò accade, In genere cancello il messaggio. Non è niente di personale; E' che non avrei mai avuto il tempo di darvi la risposta dettagliata richiesta.

Come regola generale, più complessa è la domanda, meno probabile che io risponda. Se potete snellite la vostra domanda prima di spedirmela e siate sicuri di includere ogni informazione pertinente (come la piattaforma, il compilatore, i messaggi d'errore che avete ottenuto, e tutto quello che pensate possa aiutarmi a venire a capo del problema), è molto più probabile che otteniate una risposta. Per ulteriori suggerimenti, leggete il documento di ESR, How To Ask Questions The Smart Way.

Se non ottenete una risposta, smanettateci su un altro po', cercando di trovare la risposta, e se ancora non ci arrivate, allora scrivetemi ancora con le informazioni che avete trovato e si spera che siano abbastanza per me da potervi aiutare.

Ora che vi ho ammoniti su come scrivermi e non scrivermi, Volevo solo farvi sapere che apprezzo tutti i complimenti che la guida ha ottenuto negli anni. E' davvero una spinta morale, e mi fapiacere che essa sia stata ben usata! :-) Grazie!

Mirroring

Siete più che benvenuti a realizzare mirror di questo sito, sia pubblicamente che privatamente. Se create un mirror pubblicamente e volete ottenere un link dalla mia pagina, mandatemi due righe a at .

Note per i traduttori

Se volete tradurre la guida in un altro linguaggio, scrivetemi a e metterò un link alla vostra traduzione dalla pagina principale.

Sentitevi liberi di aggiungere il vostro nome e indirizzo alla traduzione.

Perdonatemi, a causa di problemi di spazio, non posso tenere sul mio sito le traduzioni .

Copyright and Distribution

Beej's Guide to Network Programming is Copyright "1995-2001"; Brian "Beej" Hall.

This guide may be freely reprinted in any medium provided that its content is not altered, it is presented in its entirety, and this copyright notice remains intact.

Educators are especially encouraged to recommend or supply copies of this guide to their students.

This guide may be freely translated into any language, provided the translation is accurate, and the guide is reprinted in its entirety. The translation may also include the name and contact information for the translator.

The C source code presented in this document is hereby granted to the public domain.

Contact for more information.