Dopo la creazione di un socket di descrittore, p. es., sd, il server associa un indirizzo al socket con la funzione bind:
rc = bind ( sd, indirizzo, lunghezza );
Ove:
Solitamente al socket di un server viene associato l'indirizzo di una struttura derivata da un file di configurazione. Nulla vieta' pero' di usare una stringa qualsiasi. Bisogna fare attenzione che al termine della connessione, a meno di aver esplicitamente disallocato questo indirizzo, esso rimarra' in uso per un periodo di tempo dell'ordine di alcuni minuti e non si potra' rilanciare lo stesso programma server.
rc = listen ( sd , lungcoda ); Ove:
nuovo_sd = accept ( sd , indircli, lungcli );
Questa funzione e' la corrispettiva della funzione connect del client (vedi sotto) ed e' quella che effettivamente apre la connessione dal lato server.
In questa funzione di accept:
Quando arriva una richiesta di connessione dalla rete al socket su cui il server e' in ascolto, arriva effettivamente un pacchetto che contiene le quattro informazioni elementari:
Queste informazioni vengono registrate dal server in una struttura che si trova a indirizzo idircli.
La funzione accept e' sincrona e bloccante: il server sospende ogni operazione finche' non arriva dalla rete una richiesta da parte di un client. In quel momento il server tipicamente esegue una chiamata fork e si spezza in due processi, il padre ed il figlio. Il processo figlio compie il servizio richiesto dal client usando per la comunicazione questo nuovo socket new_sd che pertanto si chiama il socket di servizio.
Il processo client dopo la creazione di un socket che gli ha fornito un descrittore sd, invoca la funzione:
rc = connect ( sd , indirizzo , lunghezza );
Ove:
Anche la chiamata connect e' sincrona e bloccante per il processo. Il sottostante protocollo di comunicazione quasi sempre fornisce un timeout e la funzione ritorna con errore se la connessione non avviene in questo tempo. Ci pensa il protocollo di comunicazione a gestire il fatto che la connessione era stata richiesta al socket di ascolto del server ma poi data su un socket di servizio.
Una volta stabilita la connessione il client e il server possono leggere e/o scrivere da/in un socket. E' evidente che se il programma del client prevede la scrittura di certe informazioni, il corrispondente programma server deve prevederne la lettura, e viceversa.
Le funzioni disponibili sono read e write.
num = read ( sd, buffer, lunghezza );
Ove:
La lettura e' bloccante e sincrona: il processo viene sospeso fino che non vi siano effettivamente dei byte da leggere dal socket, ovvero fino che il corrispondente non abbia eseguito una operazione di scrittura. A seconda dei protocolli di trasporto usati puo' essere impostato un timeout massimo di attesa.
num = write ( sd, buffer, lunghezza );
Anche la scrittura e' sincrona: il processo scrivente viene sospeso o per un timeout massimo o finche' il corrispettivo processo non abbia eseguito la lettura.