16.06.2013 Views

2 - Amiga Magazine Online

2 - Amiga Magazine Online

2 - Amiga Magazine Online

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

server. Risultato finale: entrambi i lati fermi in attesa dell'ar-<br />

rivo di n. situazione nota anche come stallo.<br />

La principale causa di perdita di pacchetti è il congestiona-<br />

mento dei cosiddetti router o instradatori, responsabili del-<br />

la gestione del traffico su Internet e paragonabili agli atleti<br />

di una corsa a staffetta. Se in un determinato momento un<br />

router riceve una quantità di dati superiore alle sue capa-<br />

cità di smistamento, esso si limita a ignorare i pacchetti IP<br />

in più (fenomeno noto come dropping), contando sul fatto<br />

che i protocolli superiori provvedano a rispedirli prima o<br />

poi.<br />

In molti casi di stallo non resta che aspettare. Esistono am-<br />

biti però in cui tale approccio è poco conveniente. Suppo-<br />

nendo di lavorare inviando blocchi di dati, per esempio<br />

una struttura, perché attendere n se l'applicazione sa che il<br />

suo contenuto è reso obsoleto da n+l? Un caso tipico è un<br />

gioco che informi l'altro computer dello stato del personag-<br />

gio, inviando continuamente le sue coordinate, energia, abi-<br />

lità, oggetti posseduti e via dicendo. Oppure, ancora, esisto-<br />

no applicazioni come la trasmissione audio in cui il fattore<br />

tempo è critico e in cui si fa uso di algoritmi adattivi in gra-<br />

do di lavorare anche se viene persa una parte dei dati.<br />

In tali situazioni è quindi utile UDP, protocollo "ombra" di<br />

TCP, il quale è ben più famoso in virtù dei tanti protocolli<br />

superiori che ad esso fanno ricorso (tra i tanti, HTTP, FTP,<br />

SMTP, Telnet e NNTP).<br />

Trasmissione fai-&-te<br />

Se da parte sua TCP stabilisce una connessione con il com-<br />

puter remoto, negozia alcuni parametri, scambia dati (con<br />

tanto di bufferizzazione bidirezionale) e infine chiude il<br />

collegamento, UDP non prevede nulla di tutto ciò. Esso in-<br />

via direttamente i blocchi di dati, non garantendone l'arri-<br />

vo. Ciò comporta un carico molto minore, innanzitutto per-<br />

ché viene a mancare totalmente la fase di apertura e chiu-<br />

sura del collegamento, ma anche perché in fase di scambio<br />

dati non awiene gestione di buffer in uscita, verifica di av-<br />

venuta ricezione o riordinamento dei dati. In virtù di ciò,<br />

TCP è definito come un protocollo con connessione e afJZ-<br />

dabile, mentre UDP è senza connessione e inaffidabile.<br />

Per capire meglio le differenze, si possono paragonare i<br />

protocolli a una comunicazione che avvenga rispettiva-<br />

mente tramite telefono (TCP) o posta (UDP). Nel primo ca-<br />

so, si invia una richiesta di connessione (si compone il nu-<br />

mero finché l'abbonato non risponde), si negoziano alcuni<br />

parametri (si chiede di parlare con la persona a cui si è in-<br />

teressati), awiene lo scambio di dati (si parla con l'interlo-<br />

cutore), si chiude infine la connessione (si riaggancia).<br />

Nel secondo caso, invece, ci si limita a preparare i dati (si<br />

scrive la lettera) e inoltrarli al destinatario (la si invia), nella<br />

speranza che il protocollo (il servizio postale) li recapiti<br />

con successo e che all'indirizzo indicato vi sia una applica-<br />

zione in attesa di dati (qualcuno che legga la lettera). Nel<br />

caso di invii multipli, inoltre, può capitare che due lettere<br />

spedite in giorni diversi siano consegnate e quindi lette in<br />

ordine inverso.<br />

L'apparente povertà di funzionalità di UDP viene bilanciata<br />

dalla maggiore flessibiliti. A seconda delle sue esigenze, in<br />

caso di mancato arrivo di pacchetti, l'applicazione può ri-<br />

spedirne alcuni ritenuti "chiave" o proseguire normalmen-<br />

te. Tocca quindi al programmatore stabilire l'approccio più<br />

consono, modellando opportunamente il codice.<br />

Dalla teoria a h pratica<br />

Un esempio, si sa, vale mille parole. Vediamo quindi un sem-<br />

plice programma, il cui sorgente appare nel Listato 1. Esso si<br />

limita a inviare e ricevere pacchetti a un'altra copia del pro-<br />

gramma, in esecuzione sullo stesso computer o su una<br />

macchina remota. Una comunicazione UDP awiene usan-<br />

do funzioni analoghe a quelle usate per TCP e descritte nel<br />

numero 81 di TransAction, analizzeremo quindi solo le dif-<br />

ferenze rispetto al precedente articolo. Per maggiore como-<br />

dità, si è fatto ricorso alle funzioni di autoinizializzazione e<br />

di chiusura della libreria statica netlib, che aprono e chiu-<br />

dono automaticamente SocketBase. Lo stesso socket viene<br />

deallocato automaticamente dalla libreria bsdsocket.<br />

Innanzitutto viene fatto uso di una ottimizzazione, duran-<br />

te la ricerca dell'indirizzo remoto, viene provata prima la<br />

funzione:<br />

ULONG inet-addr(const UBYTE *);<br />

Passando come parametro una stringa contenente un indirizzo<br />

numerico (es. "192.168.12.45"), sarà restituito un valore<br />

a 32 bit, mentre per un qualsiasi altro tipo di stringa (es.<br />

"host.dominio.it") sarà restituita la costante INADDR-NO-<br />

NE. Solo in quest'ultimo caso ricorreremo a gethostbyname(<br />

), la quale è ben più dispendiosa, dovendo effettuare<br />

la ricerca dell'indirizzo nei file di configurazione dello stack<br />

o presso il nameserver.<br />

I1 passo successivo è l'apertura del socket. Siamo interessati<br />

a una comunicazione per pacchetti, quindi impostiamo il<br />

parametro sockettype a SOCK-DGRAM:<br />

sock = socket(AF-INET, SOCK-DGRAM, O);<br />

A questo punto associamo il socket a una porta, ricorrendo a<br />

bind( ), i cui parametri sono gli stessi di connect( ). Diversa-<br />

mente da quest'ultima, però, la struttura sockaddrè relativa a<br />

una porta locale. In tal modo il programma dall'altro lato sa<br />

chi è stato a inviare i dati (per filtrare eventualmente pac-<br />

chetti indesiderati) e a quale porta spedire le sue risposte:<br />

struct sockaddr-in mysockaddr;

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!