Protocolli di Trasporto
Socket

Un socket normale è un terminatore di rete elettrica.
- Quando si inserisce un plug ne esce corrente
- Si ignorano i dettagli della rete elettrica
- Vi sono più tipi di prese e spine
Un socket di rete è un terminatore di rete dati.
- Quando ci si collega fluiscono i dati
- Si ignorano i dettagli della rete dati
- Vi sono più tipi di socket di rete
Vi sono due prncipali tipi di socket.
Socket UNIX (in Windows: Socket Local):
- Per IPC (Inter Process Communication) tra processi locali
- Simile ad una pipe, ma può essere asincrono
- Implementato da un file speciale a file system e da un buffer nel kernel
- Molto usato in Linux
Socket Inet:
- Per comunicazioni con i protocolli TCP/IP
- Implementato tramite un record (
struct sockaddr) che contiene i parametri di comunicazione
Vi sono moltissimi altri tipi di socket, per altre cataste di protocolli
Visualizzare tutti i socket in uso:
netstat -an
System Call socket
Chiamata di sistema per avere un socket:
int s;
s=socket(int domain, int type, int protocol);
- domain - Addressing Format - formato indirizzi
AF_UNIX- un parametro: nome fileAF_INET- struct con 4 parametri- IP sorgente
- IP destinazione
- Porta sorgente
- Porta destinazione
- type - tipo di servizio richiesto - per AF_INET:
SOCK_STREAM- trasporto TCPSOCK_DGRAM- trasporto UDPSOCK_RAW- nessun trasporto (p.es. ICMP)
- protocol - protocollo internetworking da
/etc/protocols0- IP
Funzioni per socket
Dopo l’apertura del socket s sono disponibili le funzioni (alcune):
int bind(int s, const struct sockaddr *addr, socklen_t addrlen);- associa un indirizzo ad un socket (server)
- serve a settare la porta (p.es.80 per HTTP)
int listen(int s, int backlog);- ascolta passivamente su un socket (server)
- backlog è la lunghezza di una coda (tipicamente 5)
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);- gestisce la richiesta di connessione (TCP, server)
int connect(int s, const struct sockaddr *addr, socklen_t addrlen);- richiede una connessione (TCP, client)
ssize_t read(int s, void *buf, size_t count);- legge dal socket in un buffer (TCP)
ssize_t write(int s, const void *buf, size_t count);- scrive dal buffer ad un socket (TCP)
ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);- invia un buffer ad un indirizzo di destinazione (UDP)
ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);- riceve in un buffer da un indirizzo sorgente (UDP)
int close(int s);- chiude il socket

Schema di connessione
Prima parte il server, poi il client.

Più clients: wait
Un secondo client trova il server occupato e viene posto in coda.

Più clients: nowait
Non è il server si ascolto, ma quello di servizio a gestire la connessione.

Port multiplexing
Un server di ascolto può gestire più porte.
