-
1
Dott.ssa Valeria Carofiglio
Introduzione alla programmazione C di socket
(testo di riferimento :M. J. Donahoo, K. L. Calvert,
TCP/IP Sockets in C: Practical Guide for Programmers. Morgan Kaufman Publishers. )
A.A. 2005/06
Dott.ssa Valeria Carofiglio
Una rete TCP/IP
Applicazione
TCP
IP
Socket API
HOST
canale IP canale
Applicazione
TCP
IP
Socket API
HOSTEs: ethernet Router
Organizzazione a livelli: relazione tra protocolli, applicazioni e API socket
Implementazione dei protocolli
(S.O.)
-
2
Dott.ssa Valeria Carofiglio
Indirizzo Internet (usato da IP)
• identificatori a 32 bit
• notazione: 193.204.187.194
• identifica una interfaccia
• www.di.uniba.it 193.204.1..
IndirizziLa comunicazione tra programmi è possibile se si conosce l’indirizzo dei
programmi che devono comunicare
Numero di porta (interpretato da TCP o UDP)
• identificatori a 16 bit (sempre in relazione ad un IP)
• range: •Well-Known: 0 1023
•Registered: 1024 49151
•Dynamic (private) 49152 65535
http://www.iana.org/assignments/port-numbers193.204.187.194209.134.xxx.xxx
193.204.187.194
Porta
Aplicazione wwwE-mail
80 23
Dott.ssa Valeria Carofiglio
Una Socket: una visione di insieme
• Una socket è un dispositivo che consente la comunicazione (trasferimento di dati) tra due processi su internet, in una LAN, su un singolo computer…
• Esistono varie famiglie di socket. Ogni famiglia riunisce i socket che utilizzano gli stessi protocolli (Protocol Family) sottostanti, supporta un sottoinsieme di stili di comunicazione e possiede un proprio formato di indirizzamento (AddressFamily)
Alcuni esempi di famiglie• Unix Domain sockets: file in una directory di un computer local host. Consentono il trasferimento di dati tra processi sulla stessa macchina Unix• Internet socket (AF_INET): consentono il trasferimento di dati tra processi posti su macchine remote connesse tramite una LAN o Internet
-
3
Dott.ssa Valeria Carofiglio
Una Socket: una visione di insieme (cont.)
• Il tipo di una socket definisce una modalità di comunicazione che una socket usa per inviare dati:
– Streaming Socket (SOCK_STREAM): Fornisce una connessione sequenziale, affidabile e full-duplex. Il protocollo TCP è basato su questo tipo di socket.
– Datagram socket (SOCK_DGRAM): Supporta i datagrammi (privo di connessione, messaggi inaffidabili di una lunghezza massima prefissata). Il protocollo UDP è basato su questo tipo di socket
AF_INET + SOCK_STREAM determineranno una connessione TCP, AF_INET + SOCK_DGRAM determineranno una trasmissione UDP
Osserviamo che:
Dott.ssa Valeria Carofiglio
Socket, Protocolli e Porte su un singolo host
Una socket che usa la famiglia di protocolli TCP/IP è univocamente determinata da un indirizzo internet, un protocollo di comunicazione (TCP o
UDP) e un numero di porta
TCP
IP
…
UDP
…1 2 65535 … 1 2 65535 ……
…Applicazioni
Socket TCP
Porte TCP
Socket UDP
Porte UDP
Applicazioni
HostDescriptor referenceSockets bound to ports
-
4
Dott.ssa Valeria Carofiglio
Una Socket: una visione di insieme (cont.)
• Nel gergo socket uno dei processi che comunicano è chiamato Server e l’altro Client. Tra i due processi il server è quello che ha controllo maggiore, poiché è il processo che inizialmente crea la socket. Più client possono comunicare attraverso la stessa socket, ma solo un server può essere associato ad una definita socket.
Il fatto che un programma agisca come client o come server determina un differente uso delle API Socket
• Il client ha bisogno di conoscere l’indirizzo del server (ma non il viceversa)• Il Server può apprendere informazioni sull’indirizzo del client una volta stabilita la connessione
Dott.ssa Valeria Carofiglio
Programmazione socketLo sviluppatore ha il controllo di tutto ciò che sta sul lato del livello
applicativo della socket, ma ha poco controllo sul lato a livello di trasporto (alcuni parametri)
TCP
IP
…
UDP
…1 2 65535 … 1 2 65535 ……
…Livello di trasporto
Livello di Applicazione
Host
-
5
Dott.ssa Valeria Carofiglio
Programmazione socket (cont.)Il client deve contattare il server
• Il programma server deve essere in esecuzione come processo
• Il programma server deve avere una porta (socket) che dia il benvenuto al contatto iniziale stabilito da un processo client in esecuzione
Il client contatta il server tramite:
• la creazione di una socket locale
• la specifica di un indirizzo del processo server (IP, numero di porta relativi al processo)
• Dopo la creazione della socket nel client: TCP avvia un handshake a tre vie e stabilisce una connessione TCP con il server
• Durante l’handshake a tre vie: il TCP server crea un nuova socket (dedicata a quel particolare client – socket di connessione)
Dott.ssa Valeria Carofiglio
Interazione TCP Client/Server
Client1. (Inizializzare una WSA)2. Creare una Socket3. Connettersi al server4. Inviare e ricevere dati5. Chiudere la connessione
Server1. (Inizializzare una WSA)2. Creare una socket 3. Assegnare un local address alla
socket4. Settare la socket all’ascolto5. Iterativamente:
a. Accettare una nuovaconnessione
b. Inviare e ricevere datic. Chiudere la connessione
-
6
Dott.ssa Valeria Carofiglio
Una astrazione di una socket:Strutture dati associate ad una socket TCP
Descrittori
Closed
Local port
Local IP
Remote port
Remote IP
App
licaz
ione
Impl
emen
tazi
one
della
soc
ket
• L’applicazione fa riferimento alla struttura di una socket tramite descrittori• differenti processi possono fare riferimento alla stessa struttura socket
• informazioni associate alla struttura socket:
• code di ricezione e invio
• informazioni sullo stato dell’handshake (per una socket TCP)
• indirizzi internet
Struttura di una socket
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCPNotazione
Closed
Local port
Local IP
Remote port
Remote IP
App
licaz
ione
Impl
emen
tazi
one
della
soc
ket
Handshake
completato
Connecting
PA.B.C.D
QW.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Established
PA.B.C.D
QW.X.Y.Z
Local port
Local IP
Remote port
Remote IP
connect()
blocca
Eventi all’interno dell’applicazione che causano il cambiamento di stato di una struttura socket
Eventi come l’arrivo di messaggi, ecc..
Indirizzi:A.B.C.D = client W.X.Y.Z server
Q= porta del server
-
7
Dott.ssa Valeria Carofiglio
Interazione TCP Client/Server
Client1. (Inizializzare una WSA)2. Creare una Socket3. Connettersi al server4. Inviare e ricevere dati5. Chiudere la connessione
Server1. (Inizializzare una WSA)2. Creare una socket 3. Assegnare un local address alla
socket4. Settare la socket all’ascolto5. Iterativamente:
a. Accettare una nuovaconnessione
b. Inviare e ricevere datic. Chiudere la connessione
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCPStabilire una connessione (lato client)
Closed
Local port
Local IP
Remote port
Remote IP
Impl
emen
tazi
one
della
soc
ket
App
licaz
ione
cl
ient Una socket creata
fa riferimento ad un protocollo
specifico ma non ha indirizzo IP e numero diporta
-
8
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCPStabilire una connessione (lato client)
Closed
Local port
Local IP
Remote port
Remote IP
Impl
emen
tazi
one
della
soc
ket
connect() con IP W.X.Y.Z e porta Qblocca
App
licaz
ione
cl
ient
Completa i campi;
Invia richiesta di connes. al server
Connecting
PA.B.C.D
QW.X.Y.Z
Local port
Local IP
Remote port
Remote IP
P non in uso da altre socket
indirizzo dell’interfaccia attraverso cui vengono
inviati i pacchetti al server
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCPStabilire una connessione (lato client)
Closed
Local port
Local IP
Remote port
Remote IP
Impl
emen
tazi
one
della
soc
ket
connect() con IP W.X.Y.Z e porta Qblocca
App
licaz
ione
cl
ient
Completa i campi;
Invia richiesta di connes. al server
Connecting
PA.B.C.D
QW.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Handshakea tre vie
• una richiesta di connessione client server• Un ack server client• Un ack client server
-
9
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCPStabilire una connessione (lato client)
Closed
Local port
Local IP
Remote port
Remote IP
Impl
emen
tazi
one
della
soc
ket
connect() con IP W.X.Y.Z e porta Qblocca
App
licaz
ione
cl
ient
Completa i campi;
Invia richiesta di connes. al server
Connecting
PA.B.C.D
QW.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Handshakea tre vie
completato
Established
PA.B.C.D
QW.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCPStabilire una connessione (lato client)
Closed
Local port
Local IP
Remote port
Remote IP
Impl
emen
tazi
one
della
soc
ket
connect() con IP W.X.Y.Z e porta Qblocca
App
licaz
ione
cl
ient
Completa i campi;
Invia richiesta di connes. al server
Connecting
PA.B.C.D
QW.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Handshakea tre vie
completato
Established
PA.B.C.D
QW.X.Y.Z
Local port
Local IP
Remote port
Remote IP
• il client considera la connessione stabilita non appena riceve l’ack dal server• se il server non accetta una connessione invia un messaggio
-
10
Dott.ssa Valeria Carofiglio
Closed
Local port
Local IP
Remote port
Remote IP
App
licaz
ione
se
rver
Impl
emen
tazi
one
della
soc
ket
Il ciclo di vita di una socket TCP(cont.)Setup della socket (lato server)
il server deve legare la socket ad una porta locale nota al client
(Q)
Dott.ssa Valeria Carofiglio
Closed
Local port
Local IP
Remote port
Remote IP
App
licaz
ione
se
rver
Impl
emen
tazi
one
della
soc
ket
Closed
QINADDR_ANY
**
Local port
Local IP
Remote port
Remote IP
bind() con porta Qreturns
Il ciclo di vita di una socket TCP(cont.)Setup della socket (lato server)
Setta indirizzo locale e porta
nel caso in cui il server ha più di un IP, consente alla socket di ricevere
connessioni indirizzate da tutti i suoi IP
-
11
Dott.ssa Valeria Carofiglio
Closed
Local port
Local IP
Remote port
Remote IP
App
licaz
ione
se
rver
Impl
emen
tazi
one
della
soc
ket
Closed
QINADDR_ANY
**
Local port
Local IP
Remote port
Remote IP
bind() con porta Qreturns
Il ciclo di vita di una socket TCP(cont.)Setup della socket (lato server)
Setta indirizzo locale e porta
Setta all’ascolto
Listeningnuove conn.
QINADDR_ANY
**
Local port
Local IP
Remote port
Remote IP
listen()
Return
Qualunque richiesta di connessione che avviene prima della listen() verrà rigettata
Dott.ssa Valeria Carofiglio
App
licaz
ione
Impl
emen
tazi
one
della
soc
ket
accept()
Blocca sino alla connessione con un client
Il ciclo di vita di una socket TCP(cont.)Accettare la connessione (lato server)
Listeningnuove conness.
Q*
**
Local port
Local IP
Remote port
Remote IP
-
12
Dott.ssa Valeria Carofiglio
Impl
emen
tazi
one
della
soc
ket
Richiesta di connes-sione da A.B.C.D/P
Il ciclo di vita di una socket TCP(cont.)Gestione della richiesta di connessione in entrata
Processo trasparente
Listeningnuove connessi.
Q*
**
Local port
Local IP
Remote port
Remote IPConnecting
QW.X.Y.Z
PA.B.C.D
Local port
Local IP
Remote port
Remote IP
Creare una nuova socket per la connessione,
settare gli indirizzi e continuare l’handshake
IP di destinazione
IP e porta del mittente
ack server client
Dott.ssa Valeria Carofiglio
Impl
emen
tazi
one
della
soc
ket
Richiesta di connes-sione da A.B.C.D/P
Il ciclo di vita di una socket TCP(cont.)Gestione della richiesta di connessione in entrata
Processo trasparente
Listeningnuove connessi.
Q*
**
Local port
Local IP
Remote port
Remote IPConnecting
QW.X.Y.Z
PA.B.C.D
Local port
Local IP
Remote port
Remote IP
• il numero di porta locale è lo stesso per le due socket•La socket originale non cambia stato
Creare una nuova socket per la connessione,
settare gli indirizzi e continuare l’handshake
-
13
Dott.ssa Valeria Carofiglio
Impl
emen
tazi
one
della
soc
ket
Richiesta di connes-sione da A.B.C.D/P
Il ciclo di vita di una socket TCP(cont.)Gestione della richiesta di connessione in entrata
Processo trasparente
Listeningnuove connessi.
Q*
**
Local port
Local IP
Remote port
Remote IPConnecting
QW.X.Y.Z
PA.B.C.D
Local port
Local IP
Remote port
Remote IP
Handshakecompletato
Established
QW.X.Y.Z
PA.B.C.D
Local port
Local IP
Remote port
Remote IP
Creare una nuova socket per la connessione,
settare gli indirizzi e continuare l’handshake
• il server non considera la connessione stabilita finchè non viene inviato il terzo messaggio
Dott.ssa Valeria Carofiglio
App
licaz
ione
Impl
emen
tazi
one
della
soc
ket
accept()
Blocca sino alla connessione con un client
Il ciclo di vita di una socket TCP(cont.)Accettare la connessione (lato server)
Evento descritto in Richiesta di connes-sione in entrataListening
nuove conness.
Q*
**
Local port
Local IP
Remote port
Remote IP
Established
QW.X.Y.Z
PA.B.C.D
Local port
Local IP
Remote port
Remote IP
Ritorna il descrittore per questa socket (socket di connessione)
ListeningNuove connessi.
Q*
**
Local port
Local IP
Remote port
Remote IP
Rimuove la socket dalla lista di nuove conness.
-
14
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCP(cont.)Chiudere la connessione (indipendente dal lato)
App
licaz
ione
Impl
emen
tazi
one
della
soc
ket
close()
Returns immediately
Terminazione senza perdita di dati in transito
• un msg di chiusura viene inviato all’altra parte (fine dati da trasferire)• un ack per questo msg viene inviato
Ha inizio un handshake di chiusura,
Il descrittore viene deallocato
Established
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCP(cont.)Chiudere la connessione (indipendente dal lato)
App
licaz
ione
Impl
emen
tazi
one
della
soc
ket
close()
Returns immediately
Terminazione senza perdita di dati in transito
• un msg di chiusura viene inviato all’altra parte (fine dati da trasferire)• un ack per questo msg viene ricevuto
• La connessione viene chiusa completamente solo quando un handshakesimile avviene in direzione opposta
Ha inizio un handshake di chiusura,
Il descrittore viene deallocato
Established
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
-
15
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCP(cont.)Chiudere la connessione (indipendente dal lato)
Established
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
App
licaz
ione
Impl
emen
tazi
one
della
soc
ket
close()
Returns immediately
Ha inizio un handshake di chiusura,
Il descrittore viene deallocato
Terminazione senza perdita di dati in transito
Closed
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Half-Closed
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Hsmsg
Dott.ssa Valeria Carofiglio
Il ciclo di vita di una socket TCP(cont.)Chiudere la connessione (indipendente dal lato)
Established
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
App
licaz
ione
Impl
emen
tazi
one
della
soc
ket
close()
Returns immediately
Ha inizio un handshake di chiusura,
Il descrittore viene deallocato
Terminazione senza perdita di dati in transito
Closed
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Half-Closed
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Hsmsg Time-wait
P
A.B.C.D
Q
W.X.Y.Z
Local port
Local IP
Remote port
Remote IP
Hsack
-
16
Dott.ssa Valeria Carofiglio
Funzione socket()Crea una socket dedicata ad un fornitore di servizi specifico
SOCKET socket( int af, int type, int protocol );
Address family(AF_INET: Internet Address Family)
Tipo di socket Protocollo da usare con la socket per l’address family indicata(solitamente posto a 0indica il protocollo derivato dalla coppia [af, type])
Supporta i datagrammi (privo di connessione, messaggi inaffidabili di una lunghezza massima prefissata). Il protocollo UDP è basato su questo tipo di socket.
SOCK_DGRAM
Fornisce una connessione sequenziale, affidabile e full-duplex. Il protocollo TCP è basato su questo tipo di socket.
SOCK_STREAM
SignificatoTipo
Dott.ssa Valeria Carofiglio
Funzione socket(): valori di ritornoCrea una socket dedicata ad un fornitore di servizi specifico
SOCKET socket( int af, int type, int protocol );
La funzione restituisce un intero che è interpretato come un descrittore che referenzia la nuova socket in caso di successo.
Altrimenti restituisce un codice di errore
-
17
Dott.ssa Valeria Carofiglio
Funzione socket(): valori di ritornoCrea una socket dedicata ad un fornitore di servizi specifico
SOCKET socket( int af, int type, int protocol );
ATTENZIONE!!!
La funzione crea un socket senza nome
Bind()
• Address Family
• Indirizzo IP
• Porta che identifical’applicazione
Una applicazione client usa indirizzo IP e porta per connettersi
La funzione restituisce un intero che è interpretato come un descrittore che referenzia la nuova socket in caso di successo.
Altrimenti restituisce un codice di errore
Dott.ssa Valeria Carofiglio
Funzione bind()Associa un nome alla socket creata in precedenza
int bind( SOCKET s, const struct sockaddr* name, int namelen);
Descrittore di un socket
Indirizzo da assegnare alla
socket
Lunghezza in byte di name
-
18
Dott.ssa Valeria Carofiglio
Struttura sockaddr_in
Forma di sockaddr In AF_INET (con protocollo IPv4)
La struttura sockaddrè interpretata differentemente a seconda dei contesti determinati dalle
differenti address family (AF_XXXX).
bind( m_socket, (SOCKADDR*) &service, sizeof(service)
struct sockaddr_in {short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero[8];
};
Un puntatore ad una sockaddr non è rigorosamente interpretato come tale
Le funzioni Winsock che fanno uso di un puntatore ad una struttura di tipo sockaddr devono necessariamente effettuare una operazione di “cast”
Dott.ssa Valeria Carofiglio
Funzione bind(): valori di ritornoAssocia un nome alla socket creata in precedenza
int bind( SOCKET s, const struct sockaddr* name, int namelen);
La funzione restituisce ‘O’ in caso di successo. Altrimenti restituisce un codice di errore
Per il TCP/IP se la porta è specificata come zero, il fornitore di serviziassegna una porta tra 1024 e 5000
L’applicazione può usare la funzione getsockname (dopo la bind) per apprendere l’indirizzo IP e la porta assegnati
-
19
Dott.ssa Valeria Carofiglio
…un esempio di codice#include #include "winsock2.h"
void main() {// Initialize WinsockWSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
// Create a SOCKET for listening for incoming connection requestsSOCKET ListenSocket;ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());WSACleanup();return;}
// The sockaddr_in structure specifies the address family, IP address, and port for the socket that //is being bound.sockaddr_in service;service.sin_family = AF_INET;service.sin_addr.s_addr = inet_addr("127.0.0.1");service.sin_port = htons(27015);
Dott.ssa Valeria Carofiglio
…un esempio di codice (cont.)// Bind the socket.if (bind( ListenSocket, (SOCKADDR*) &service, sizeof(service)) ==
SOCKET_ERROR) {printf("bind() failed.\n");closesocket(ListenSocket);return;
}
WSACleanup();return;
}
-
20
Dott.ssa Valeria Carofiglio
Funzione listen()Setta la socket in uno stato in cui rimane in attesa di richiesta di
connessioni
int listen( SOCKET s, int backlog);
Descrittore di un socket
Massima lungezza dellacoda di connessionientranti
Dott.ssa Valeria Carofiglio
Funzione listen(): valori di ritornoSetta la socket in uno stato in cui rimane in attesa di richiesta di
connessioni
int listen( SOCKET s, int backlog);
Descrittore di un socket
Massima lungezza dellacoda di connessionientranti
La funzione restituisce ‘O’ in caso di successo. Altrimenti restituisce un codice di errore
-
21
Dott.ssa Valeria Carofiglio
Funzione accept()Consente un tentativo di connessione in entrata su una socket
SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen);
Descrittore di un socket
Puntatore opzionale ad un buffer che ricevel’indirizzo dell’entitàche fa richiesta di
connessione
Puntatore opzionaleche contiene la
lunghezza di addr
Dott.ssa Valeria Carofiglio
Funzione accept()Consente un tentativo di connessione in entrata su una socket
SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen);
La funzione estrae la prima connessione dalla coda di pendenza delleconnessioni sul socket s.
Successivamente crea e restituisce un riferimento ad una nuovasocket.
Questa nuova socket è quella che abbiamo chiamato socket di connessione.
Mantiene le stesse prorpieta della socket s
-
22
Dott.ssa Valeria Carofiglio
Funzione connect()Stabilisce una connessione ad una socket specificata
int connect( SOCKET s, const struct sockaddr* name, int namelen);
Descrittore di un socket non connesso
Nome della socket con cui dovrebbe essere
stabilita la connessione
lunghezza di name
Dott.ssa Valeria Carofiglio
Funzione connect()Stabilisce una connessione ad una socket specificata
int connect( SOCKET s, const struct sockaddr* name, int namelen);
Per una socket di tipo “connectionless” (per esempio SOCK_DGRAM), la connect() semplicemente stabilisce un indirizzo di destinazione di
default
Qualunque datagram ricevuto da un indirizzo diverso da quello di destinazione verrà scaricato
Se il campo indirizzo della struttura che specifica il name è zero, la socket verrà disconnessa
-
23
Dott.ssa Valeria Carofiglio
…un esempio di codice#include #include "winsock2.h"void main() {
// Initialize WinsockWSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
// Create a SOCKET for connecting to serverSOCKET ConnectSocket;ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (ConnectSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());WSACleanup();return;
}
Dott.ssa Valeria Carofiglio
…un esempio di codice (cont.)// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.sockaddr_in clientService; clientService.sin_family = AF_INET;clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );clientService.sin_port = htons( 27015 );
// Connect to server.if ( connect( ConnectSocket, (SOCKADDR*) &clientService,
sizeof(clientService) ) == SOCKET_ERROR) {printf( "Failed to connect.\n" );WSACleanup();return;
}printf("Connected to server.\n");WSACleanup();return;
}
-
24
Dott.ssa Valeria Carofiglio
Funzione send()Invia dati ad una socket connessa
int send( SOCKET s, const char* buf, int len, int flags );
Descrittore di una socket connessa
Puntatore al Buffer contenente I dati da
trasmettere
Indicatore chespecifica il modo in cui
la chiamata è fatta
Lunghezza deidati in buf, in
byteIl flag può essere usato per influenzare il comportamento della funzione
Dott.ssa Valeria Carofiglio
Funzione send(): valori di ritornoInvia dati ad una socket connessa
int send( SOCKET s, const char* buf, int len, int flags );
Descrittore di una socket connessa
Buffer contenente I dati da trasmettere
Indicatore chespecifica il modo in cui
la chiamata è fatta
Lunghezza deidati in buf, in
byteIl flag può essere usato per influenzare il comportamento della funzione
La funzione restituisce il numero di byte trasmessi in caso di successo. Un codice di errore, altrimenti
-
25
Dott.ssa Valeria Carofiglio
Funzione recev()Riceve dati da una socket connessa (o “legata”)
int recev(SOCKET s, char* buf, int len, int flags );
Descrittore di una socket connessa
Puntatore al Buffer contenente I dati da
ricevere
Indicatore chespecifica il modo in cui
la chiamata è fatta
Lunghezza deidati in buf, in
byteIl flag può essere usato per influenzare il comportamento della funzione
Dott.ssa Valeria Carofiglio
Interazione UDP Client/Server
Client1. (Inizializzare una WSA)2. Creare una Socket3. Inviare e ricevere dati4. Chiudere la connessione
Server1. (Inizializzare una WSA)2. Creare una socket 3. Assegnare un local address alla
socket4. Iterativamente:
a. Inviare e ricevere datib. Chiudere la connessione
-
26
Dott.ssa Valeria Carofiglio
Funzione recevfrom()Riceve un datagram e memorizza l’indirizzo da cui i dati sono stati inviati
int recvfrom( SOCKET s, char* buf, int len, int flags, struct sockaddr* from, int* fromlen);
Descrittore di una socket (eventualmente) connessa
Buffer contenente I dati in ingresso
Indicatore che specifica ilmodo in cui la chiamata è
fatta
Lunghezza deidati in buf, in
byte
Il flag può essere usato per influenzare il comportamento della funzione
Puntatore opzionalead una struttura checontiene l’indirizzodella socket target
Lunghezza deidati in from, in
byte
La funzione è normalmente usata per socket non orientate alla connessione.L’indirizzo locale della socket deve essere noto
Per applicazioni Server, questo è fatto esplicitamente con la funzione bind() Il binding esplicito è scoraggiato per applicazioni client (in tal caso la funxzione
effettua un binding implicito
Dott.ssa Valeria Carofiglio
…un esempio di codice#include #include "winsock2.h"
void main() {WSADATA wsaData;SOCKET RecvSocket;sockaddr_in RecvAddr;
int Port = 27015;char RecvBuf[1024];int BufLen = 1024;
sockaddr_in SenderAddr;int SenderAddrSize = sizeof(SenderAddr);//-----------------------------------------------// Initialize WinsockWSAStartup(MAKEWORD(2,2), &wsaData);//-----------------------------------------------// Create a receiver socket to receive datagramsRecvSocket = socket(AF_INET, SOCK_DGRAM, 0);//-----------------------------------------------
-
27
Dott.ssa Valeria Carofiglio
…un esempio di codice (cont.)// Bind the socket to any address and the specified port.RecvAddr.sin_family = AF_INET;RecvAddr.sin_port = htons(Port);RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
//-----------------------------------------------// Call the recvfrom function to receive datagrams// on the bound socket.printf("Receiving datagrams...\n");
recvfrom(RecvSocket,RecvBuf,BufLen,0, (SOCKADDR*)&SenderAddr, &SenderAddrSize);//-----------------------------------------------// Close the socket when finished receiving datagramsprintf("Finished receiving. Closing socket.\n");closesocket(RecvSocket);//-----------------------------------------------// Clean up and exit.printf("Exiting.\n");WSACleanup();return;
}
Dott.ssa Valeria Carofiglio
Funzione sendto()Invia dati ad una specifica destinazione
int sendto( SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to, int tolen);
Descrittore di una socket (eventualmente) connessa
Buffer contenente I dati datrasmettere
Indicatore che specifica ilmodo in cui la chiamata è
fatta
Lunghezza deidati in buf, in
byte
Il flag può essere usato per influenzare il comportamento della funzione
Puntatore opzionalead una struttura checontiene l’indirizzodella socket target
Lunghezza deidati in to, in
byte
La funzione è normalmente usata per socket non orientate alla connessione per inviare datagram ad una specifica socket identificata dai parametri. I parametrito e tolen vengono ignorati in caso di socket orientate alla connessione e la
funzione diventa equivalente ad una send()
-
28
Dott.ssa Valeria Carofiglio
Funzione sendto():valori di ritornoInvia dati ad una specifica destinazione
int sendto( SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to, int tolen);
Descrittore di una socket (eventualmente) connessa
Buffer contenente I dati datrasmettere
Indicatore che specifica ilmodo in cui la chiamata è
fatta
Lunghezza deidati in buf, in
bytePuntatore opzionalead una struttura checontiene l’indirizzodella socket target
Lunghezza deidati in to, in
byte
La funzione restituisce il numero di byte trasmessi in caso di successo.
Un codice di errore, altrimenti
Dott.ssa Valeria Carofiglio
…un esempio di codice#include #include "winsock2.h"void main() {
WSADATA wsaData;SOCKET SendSocket;sockaddr_in RecvAddr;int Port = 27015;char SendBuf[1024];int BufLen = 1024;//---------------------------------------------// Initialize WinsockWSAStartup(MAKEWORD(2,2), &wsaData);//---------------------------------------------// Create a socket for sending dataSendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
-
29
Dott.ssa Valeria Carofiglio
…un esempio di codice (cont.)//---------------------------------------------// Set up the RecvAddr structure with the IP address of// the receiver (in this example case "123.456.789.1")// and the specified port number.RecvAddr.sin_family = AF_INET;RecvAddr.sin_port = htons(Port);RecvAddr.sin_addr.s_addr = inet_addr("123.456.789.1");//---------------------------------------------// Send a datagram to the receiverprintf("Sending a datagram to the receiver...\n");sendto(SendSocket,SendBuf,BufLen,0,(SOCKADDR *) &RecvAddr, sizeof(RecvAddr));//---------------------------------------------
// When the application is finished sending, close the socket.printf("Finished sending. Closing socket.\n");closesocket(SendSocket);//---------------------------------------------// Clean up and quit.printf("Exiting.\n");WSACleanup();return;
}
Dott.ssa Valeria Carofiglio
File header
#include #include
#include < sys/socket.h >
#include
Include tutti tutte le definizioni e i prototipi
#include #include
#include
Per socket(), connect(), send(), recev()
Per sockaddrin
windows
unix
Cambiare una applicazione winsock in una socket Unix
-
30
Dott.ssa Valeria Carofiglio
Setup dell’applicazione
Codice di inizializzazionedella libreria
winsock
WSADATA wsaData;Int iResult = WSAStartup(MAKEWORD(2 ,2), &wsaData);If (iResult != NO_ERROR)
printf(“error at WSASturtup\n”);
windows
Il codice è identico a meno del codice per inizializzarel’applicazione
comunicazione
Il codice è’ identico
Dott.ssa Valeria Carofiglio
Chiusura dell’applicazione
Close(m_socket);
Exit(0)
De-allocazione dellerisorse usate da winsock
Closesocket(m_socket);WSAcleanup();
Exit(0)
windows
unix
-
31
Dott.ssa Valeria Carofiglio
Gestione dell’errore
#include#include
void ErrorManagement(char* errorMessage) {perror(errorMessage);exit(1);
}
#include#include#include
void ErrorManagement(char* errorMessage) {printf( "Error at socket(): %ld\n", WSAGetLastError() );WSACleanup();exit(1);
}
windows
unix