Title: Windows Socket Programming
1Windows Socket Programming
- Corso di Sistemi di Elaborazione delle
Informazioni - a.a 2007/2008
- Autori Alberto Colombo
- Fulvio Frati
2Sommario
- Richiami di TCP
- Classificazione dei socket
- Socket client-server UDP
- Socket client-server TCP
- Esempio server multiporta
- gethostbyname gethostbyaddr
- Java Socket
3Richiami di TCP porte
- I protocolli TCP e UDP usano le porte per mappare
i dati in ingresso con un particolare processo
attivo su un computer. - Ogni socket è legato a un numero di porta così
che il livello TCP può identificare
lapplicazione a cui i dati devono essere
inviati.
4Socket definizione
- A livello programmatico, un Socket è definito
come un identificativo univoco che rappresenta
un canale di comunicazione attraverso cui
linformazione è trasmessa RFC 147 - La comunicazione basata su socket è indipendente
dal linguaggio di programmazione. - Client e server devono concordare solo su
protocollo (TCP o UDP) e numero di porta
5Richiami di TCP well-known ports
- Le porte sono rappresentate da valori interi
positivi (16 bit). - Rappresentano punto di collegamento fra strato
fisico e applicazioni rappresentano un canale di
comunicazione - Alcune porte sono state riservate per il supporto
di servizi well-known - ftp ? 21/tcp
- telnet ? 23/tcp
- smtp ? 25/tcp
- login ? 513/tcp.
- I servizi e i processi a livello utente
generalmente usano un numero di porta gt1024.
6Socket Comunicazione
Il server riceveuna richiesta daun client
Crea un nuovo socketche dialogherà col cliente
torna in ascolto dialtre richieste
7Socket Classificazione (1)
- Datagram Socket
- Utilizzano un protocollo senza connessione ? UDP
- Non è necessaria una procedura iniziale di
connessione e riconoscimento fra client e server - Non dà garanzie di ricezione e ordine dei
pacchetti - Stream Socket
- Utilizzano un protocollo con connessione ? TCP
- La comunicazione avviene solo fra nodi tra cui è
stato stabilito un canale di comunicazione - Garantisce ordine e ricezione dei pacchetti
- Raw socket
- DÃ completo accesso allo strato fisico del
sistema per poter sfruttare funzionalità non
implementate dalle interfaccie - Solo per utenti esperti
8Socket Classificazione (2)
- Sincroni
- il client ed il server si sincronizzano ad ogni
messaggio sia send() (per inviare) che receive()
(per ricevere) sono bloccanti - send() ritorna dopo che è stata fatta lissue
della receive - receive() ritorna solo dopo che il messaggio
arriva in coda - Asincrona
- send() non è bloccante, significa che
loperazione ritorna subito dopo che il messaggio
è stato copiato su un buffer locale - receive() puo essere sia bloccante che non. Non
bloccante significa che ritorna subito il
controllo allapplicazione, poi tramite polling o
interrupt notificherà laccodamento del messaggio
nella coda
9Differenze ambiente Unix e Windows
- Include files, tutte le librerie raccolte in una
- WSAGetLastError() al posto della variabile errno
- closeSocket() al posto di close()
- Non supporta Raw Socket
- Fork implicito
10UDP/TCP client Header
11UDP/TCP Client Inizializzazione librerie
- WSAStartup(version, WSAData)
- WORD version, versione delle librerie da caricare
- LPWSADATA WSAData, struttura per ricevere i
dettagli della Windows Socket Implementation - Necessaria solo in ambienti Windows
12UDP/TCP Client Creazione del socket
- socket(af, type, protocol)
- int af, famiglia di indirizzi da utilizzare
(AF_INET, PF_INET, AF_UNIX) - int type, tipo di socket (SOCK_STREAM,
SOCK_DGRAM) - int protocol, tipo di protocolo utilizzato
(IPPROTO_UDP, IPPROTO_TCP). - Restituisce un valore negativo se non a buon fine
13UDP Client sendTo()
- sendTo(socket, echoString, bufferLength, flag,
to, toLength) - int socket, descrittore del socket
- char echoString, messaggio da spedire
- int bufferLength, dimensione in bytes
- int flags, indica la modalità con cui viene
effettuata la chiamata (default 0) - sockaddr to, indirizzo destinatario
- int toLength, dimensione indirizzo in byte.
- Non è necessario una procedura di connessione fra
client e server
14UDP Client recvfrom()
- recvfrom(socket, buffer, bufferLength, flags,
from, fromLength) - SOCKET socket, descrittore del socket
- char buffer, messaggio spedito
- int bufferLength, dimensione in bytes
- int flags, indica la modalità con cui viene
effettuata la chiamata (default 0). - sockaddr from, indirizzo mittente
- int fromLength, dimensione indirizzo in byte.
15UDP Client Chiusura socket
closesocket(socket) chiude il socket specificato
e ritorna 0 se la chiusura è andata a buon fine,
altrimenti un codice derrore, recuperabile con
WSAGetLastError(). WSACleanup() rilascia la
libreria.
16UDP Server Port Binding
- bind(socket, address, addressLength)
- SOCKET socket,descrittore del socket
- sockaddr address, indirizzo del socket
- int addressLength, dimensione dellindirizzo in
byte. - Lega ogni comunicazione su quel protocollo e su
quella porta allapplicazione
17UDP Server Ricezione messaggi
- Il server rimane in attesa della ricezione di un
messaggio sulla recvfrom() - Nella struct echoclntAddr sono salvate tutte le
informazioni relative al chiamante (in sin_addr
lindirizzo IP)
18UDP Socket
Server INADDR_ANYClient servIP
Client
Server
19TCP Client Creazione del socket
- Crea un socket basato su TCP di tipo STREAM
20TCP Client Connessione
- Stabilisce una connessione verso uno specifico
server - connect(socket, address, addressLength)
- SOCKET socket, descrittore del socket
- sockaddr address, indirizzo del server
- int addressLength, dimensione dellindirizzo in
byte.
21TCP Client Invio dati
- Invia i dati specificati verso un socket giÃ
connesso - Non è necessario indicare ogni volta lindirizzo
del mittente - send(socket, buffer, bufferLength, flags)
- SOCKET socket, descrittore del socket
- char buffer, messaggio da inviare
- int bufferLength, dimensione del messaggio in
byte - int flag, indica la modalità con cui viene
effettuata la chiamata (default 0).
22TCP Client Ricezione dati
- Riceve dati da un socket connesso e restituisce
il numero di byte ricevuti - Quando restituisce 0 la comunicazione è
interrotta - recv(socket, buffer, bufferLength, flag)
- SOCKET socket, descrittore del socket
- char buffer, messaggio da inviare
- int bufferLength, dimensione del messaggio in
byte - int flag, indica la modalità con cui viene
effettuata la chiamata (default 0).
23TCP Server Connessione
- Dopo il bind, il server rimane in ascolto
(listen) sul socket - listen(socket, backlog)
- SOCKET socket, descrittore del socket
- int backlog, dimensione massima della coda delle
connessioni in attesa.
24TCP Server Accettazione
- Quando un client richiede la connessione, viene
un creato un nuovo socket per gestire la
comunicazione - Il socket iniziale rimane in attesa di nuove
richieste - accept(socket, clientAddress, clientAddressLength)
- SOCKET socket, descrittore del socket
- sockaddr clientAddress, indirizzo del client che
ha richiesto laccesso - int clientAddressLength, dimensione di
clientAddress in byte.
25TCP Server Select (1)
- Permette di gestire simultaneamente più socket
che gesticono porte diverse - Primo passo creazione di un array di socket
ognuno su una porta differente nellesempio la
lista delle porte è passata a riga di comando - Per ogni porta è creato un socket server distinto
26TCP Server Select (2)
- La select() ad intervalli specificati, controlla
quali socket hanno fatto richiesta in lettura,
scrittura o hanno riscontrato errori di
comunicazione e restituisce il numero di socket
interessati - I socket richiedenti sono marcati ed inseriti in
specifici array per le successive operazioni - select(0,readfds, writefds, errorfds, timeout)
- fd_set readfs, puntatore allarray di socket in
lettura - fd_set writefs, puntatore allarray di socket in
scrittura - fd_set errorfs, puntatore allarray di socket
controllati per errori - timeval timeout, tempo di attesa per la select
27TCP Server Select (3)
- Per capire quali socket hanno richiesto
laccesso, si scorre larray dei socket e si
applica FD_ISSET() - FD_ISSET restituisce un valore non-zero se il
socket è stato marcato - FD_ISSET(socket, set)
- SOCKET socket, il descrittore del socket da
controllare - fd_set set, puntatore allinsieme dei socket
marcati.
28TCP Server Select (4)
- Prima di ogni chiamata a select() è necessario
inizializzare linsieme dei socket marcabili.
Occorre invocare - FD_ZERO() svuota linsieme dei socket marcati
- FD_SET(), prepara la lista dei socket attivi,
aggiungendo allinsieme il socket che potrà poi
essere marcato dalla select()
29Esempio Socket paralleli fork (1)
- Duplica il processo
- Restituisce
- Al processo padre pid (Process Id) processo
figlio - Al processo figlio pid 0
- In caso di errore -1
- I descrittori aperti dal padre saranno condivisi
anche dal figlio - Un descrittore chiuso in un processo rimane
aperto nellaltro processo - Crea repliche del processo server per gestire
comunicazioni parallele - Lesecuzione ricomincia nel processo figlio
dallistruzione sucessiva alla fork - Chiamata di sistema tipica di Linux, non
utilizzabile sotto Windows
30Esempio Socket paralleli fork (2)
Sono nel processo padre, chiudo socket connesso e
ritorno allaccept
Sono nel processo figlio, chiudo socket
principale in ascolto e gestisco la comunicazione
con il socket connesso
31gethostbyname() gethostbyaddr()
- struct hostent gethostbyname(const char name)
- struct hostent gethostbyaddr(const void addr,
int len, int type) - Restituiscono un puntatore ad un oggetto di tipo
hostent che descrive un indirizzo internet a
partire da un nome o da un indirizzo - Parametri
- name nome dellhost da ricercare, es.
www.dti.crema.unimi.it - addr, puntatore alla struttura in_addr che
contiene lindirizzo - len, lunghezza in byte della variabile addr
- type, famiglia di indirizzi, es. AF_INET
32Riassumendo
UDP
TCP
33Java socket
- Server
- Creare un oggetto ServerSocket, specificando il
numero di porta a cui legarlo - Chiamare accept() per restare in attesa di
richieste di connessione - Quando accept() termina la connessione col client
è stabilita - accept() restituisce un socket per comunicare col
client - Client
- Creare un oggetto di tipo Socket, specificando
indirizzo e porta - Quando loggetto è costruito la connessione col
server è stabilita - La comunicazione avviene direttamente attraverso
i canali messi a disposizione dalloggetto
Socket - getInputStream(), getOutputStream(), ottengono
rispettivamente un canale di input e di output
34Java socket Serializzazione
- Il meccanismo della serializzazione permette di
scrivere e ricevere direttamente oggetti (istanze
di classi) sui flussi in output e input - Gli oggetti scambiati devono implemetare
linterfaccia Serializable - La maggior parte delle classi standard implementa
Serializable
35Java Socket Server (1)
- //SimpleServer.java un semplice programma server
- import java.net.
- import java.io.
- public class SimpleServer
- public static void main(String args)
- throws IOException
- // Registra il servizio sulla porta 1234
- ServerSocket s new ServerSocket(1234)
- // Aspetta e accetta una connessione
- Socket s1s.accept()
36Java Socket Server (2)
- // Ottiene un flusso di comunicazione associato
al socket - OutputStream s1out s1.getOutputStream()
- DataOutputStream dos new DataOutputStream(s1out
) - // Invia una stringa!
- dos.writeUTF(Hello world")
- // Chiude la connessione, ma non il socket server
- dos.close()
- s1out.close()
- s1.close()
-
-
37Java Socket Client (1)
- // SimpleClient.java un semplice programma
client - import java.net.
- import java.io.
- public class SimpleClient
- public static void main(String args)
- throws IOException
- // Apre la connessione a un server, alla porta
1234 - Socket s1 new Socket(myserver.dti.unimi.it,1
234)
38Java Socket Client (2)
- // Ottiene un file handle dal socket e legge
linput - InputStream s1In s1.getInputStream()
- DataInputStream dis new DataInputStream(s1In)
- String st new String (dis.readUTF())
- System.out.println(st)
- // Alla fine, chiude la connessione e esce
- dis.close()
- s1In.close()
- s1.close()
-
-
39Esempio socket paralleli thread
Server
Client
40Annotazioni finali
- Le slide saranno pubblicate su
- http//ra.crema.unimi.it
- References
- MSDN Getting started with Winsock