Utilizzo dei Socket per comunicazione in rete



Due computer collegati tramite una rete locale possono comunicare tra loro nella modalità Client/Server o nella modalità peer to peer.

I computer sono dotati di una scheda di rete che si collega alla LAN. I programmi per affidare alla scheda di rete i messaggi da trasferire alla rete, preparano una richiesta e la inviano al socket.

Con il termine socket si identifica lo zoccolo in cui si innesta una spina o i piedini di un dispositivo. Nel contesto della comunicazione su rete, il socket rappresenta un connettore software, quindi ideale, che si immagina che sia disponibile sulla scheda di rete e al quale si connette il programma che deve comunicare.

Il programma Server riceve i messaggi, li esamina e prepara una risposta.

Affinchè i due sistemi, mittente e destinatario, possano comunicare appoggiandosi sul protocollo TCP devono stabilire una connessione:

  1. Il client invia un pacchetto di tipo Request con la richiesta di apertura connessione (CALL_REQUEST)

  2. la rete smista il pacchetto e lo consegna al destinatario (CALL_INDICATION)

  3. il server, se è disponibile, invia un pacchetto di tipo Response per accettare la connessione

  4. il pacchetto viaggia attraverso la rete locale e viene consegnato al mittente (CALL_ACCEPTED)

A questo punto la connessione è stata stabilita e i pacchetti contenenti i dati da trasferire tra i due interlocutori transiteranno sulla connessione.

La connessione su cui viaggiano i pacchetti è rappresentata dai dispositivi di rete che partecipano allo smistamento dei pacchetti (router), ma le apparecchiature di rete gestiscono più comunicazioni sugli stessi canali fisici assegnando a ciascuna un numero di identificazione (canale logico).


La libreria winsock.h in dev-cpp

Riferimenti:

Introduzione

Per mettere in comunicazione due sistemi si può scegliere tra due servizi:

Socket, Porta, Thread

Un'applicazione che vuole comunicare, per mezzo della rete, con un'altra applicazione deve creare un socket.

Si può pensare che un socket sia l'alloggiamento in cui si innesta un connettore ideale di un cavo di comunicazione che parte dal processo (o Thread) e termina sulla scheda di rete. Il processo è un'attività in esecuzione al livello Applicazione che offre vari servizi: invia messaggi, riceve messaggi, apre una connessione, ecc…

Il processo viene identificato mediante l'indirizzo con cui il computer che lo ospita è raggiungibile sulla rete e mediante l'indirizzo che il processo possiede all'interno del computer. Questo indirizzo è chiamato numero di porta.

Ad esempio i numeri di porta assegnati ad alcuni tra i più comuni servizi di rete sono:

PortaServizio
21ftp - file transfer protocol
23telnet - il servizio terminale virtuale
25SMTP - Posta in uscita
80http - server web

Un utente, ad esempio, apre il browser che invia richieste di pagine web e mostra quelle che riceve usando la porta 80. Contemporaneamente l'utente può aprire un programma per leggere la posta elettronica usando la porta 110, può inviare una mail usando la porta 25, e può avviare una chat. Per le chat non esiste un numero di porta convenzionale, ogni programma può sceglierne uno.

L'indirizzo con cui il computer, che ospita il processo, è raggiungibile attraverso la rete è l'indirizzo IP (Internet Protocol). È formato da quattro gruppi di cifre decimali, nessun gruppo dei quali può essere maggiore di 255.

Ogni scheda di rete possiede un indirizzo di "loop-back". Questo viene usato per verificare e correggere un programma di comunicazione senza essere connessi a Internet. Questo indirizzo è 127.0.0.1. Quando un'applicazione invia un pacchetto a questo indirizzo, i bit del pacchetto attraversano tutti i circuiti della scheda di rete ma, giunti alla fine, vengono smistati sui circuiti di ricezione, anzichè sul connettore di uscita, e risalgono verso l'applicazione destinataria. In questo modo, si può avere il mittente e il destinatario del messaggio in esecuzione sullo stesso computer, allo scopo di verificare il funzionamento del programma e poi, solo dopo che sono stati eliminati gli errori dal programma, si possono separare le applicazioni: il mittente su una macchina e il destinatario su un'altra. In questo caso però le due applicazioni devono usare l'indirizzo IP pubblico.

Le persone preferiscono ricordare nomi anzichè numeri, mentre le macchine lavorano bene con i numeri. Quindi ad un computer viene assegnato un indirizzo IP ed un nome di dominio. L'utente che vuole collegarsi ad un computer, scrive il nome nella barra dell'indirizzo del browser e invia la richiesta. La rete provvede a determinare il numero di IP corrispondente al nome specificato dall'utente.

Un indirizzo di rete è un numero di 32 bit, di cui ciascun byte viene letto in decimale. Nel pacchetto che viaggerà sulla rete, l'indirizzo IP non è rappresentato con 4 gruppi di numeri decimali, ma deve essere portato nella forma a 32 bit. Si tratta quindi di trasformare i quattro gruppi di cifre decimali dell'IP in un numero a 32 bit, in trasmissione, e viceversa (da 32 bit a 4 numeri decimali) in ricezione.

Vi sono 4 funzioni che consentono di ottenere questa trasformazione:

L'applicazione Server

A questo punto il programma che ha creato il socket deve possedere un numero di porta. Un numero di porta rappresenta un identificatore del socket a cui è collegato il programma. Un client che intende comunicare con l'applicazione server deve inviare i suoi pacchetti all'indirizzo della macchina che ospita il server e deve specificare il numero della porta su cui il server è in ascolto.

La funzione bind associa indirizzo e porta al socket


L'applicazione Client

Creare un nuovo progetto, denominandolo Client, nel menu Progrtto scegliere Opzioni del Progetto ed includere la libreria libwsock32.a, come fatto per il server.


Collaudo dell'applicazione

Lanciare prima l'applicazione Server. Si aprirà una finestra dell'applicazione che mostra il messaggio "il server è in attesa di una richiesta di connessione".

Lanciare l'applicazione client. Si aprirà una finestra dell'applicazione che invita a scrivere un messaggio da spedire.

dopo aver spedito il messaggio il Server mostra il messaggio ricevuto e termina.