Socket
Daniele Contarino
Sistemi Operativi e Reti
Percorso Abilitante Speciale A.A. 2013/14
La parola Socket, se tradotta in italiano significa Presa.
L’idea non è tanto diversa rispetto alle socket
elettriche: scambiare elettricità (dati) tra due o più entità diverse che hanno tecnologie differenti, ma con un protocollo comune.
Socket
S.O. e Reti - Socket 3 di 11 Daniele Contarino
Forniscono una interfaccia di collegamento di rete (API) a livello Trasporto e sono fornite dal Sistema Operativo
Sono il punto di collegamento finale (endpoint) bidirezionale tra due processi in esecuzione
(anche remoti)
La gestione delle socket a livello applicativo è simile alla gestione dell’I/O (es. i file)
Le socket possono essere connectionless o connection-oriented
Socket
Socket in real world
Interfacce di rete Interfacce di rete OS (Linux)
Applicativo
(server)OS (Windows) Applicativo
(client)Rete fisica TCP/IP Socket
WinSocket Unix Socket
Ethernet Wireless
S.O. e Reti - Socket 5 di 11 Daniele Contarino
Client
Esercitazione di laboratorio
int main(int argc, char *argv[]){
int nByte, port = 80, pSocket;
char buffer[256];
char* address = "mioserver.it";
struct sockaddr_in serverAddress;
pSocket = socket(AF_INET, SOCK_STREAM, 0);
if (pSocket < 0){
printf("Errore durante la creazione della Socket. Il processo verra chiuso");
return 1;
}
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(port);
memcpy(&(serverAddress.sin_addr),
gethostbyname(address)->h_addr, sizeof(serverAddress.sin_addr));
Client
Esercitazione di laboratorio
if (connect(pSocket, (struct sockaddr *) &
serverAddress, sizeof(serverAddress)) < 0){
printf("Errore durante la connessione al server.
Il processo verra chiuso");
return 2;
}
nByte = write(pSocket, "Ciao Server! :P", 12);
if (nByte < 0) {
printf("Errore durante la scrittura sulla socket. Il processo verra chiuso");
return 3;
}
memset(buffer, 0, 256);
nByte = recv(pSocket, buffer, 255, 0);
if (nByte < 0){
printf("Errore durante la lettura della risposta del server. Il processo verra’ chiuso");
return 4; }
S.O. e Reti - Socket 7 di 11 Daniele Contarino
Client
Esercitazione di laboratorio
printf("Messaggio ricevuto: %s\n", buffer);
close(pSocketClient);
close(pSocket);
return 0;
}
Server
Esercitazione di laboratorio
int main(int argc, char *argv[]){
int nByte, port = 80, pSocket, pSocketClient;
char buffer[256];
struct sockaddr_in clients, clientIncoming;
pSocket = socket(AF_INET, SOCK_STREAM, 0);
if (pSocket < 0){
printf("Errore durante la creazione della Socket.
Il processo verra chiuso");
return 1;
}
clients.sin_family = AF_INET;
clients.sin_addr.s_addr = INADDR_ANY;
clients.sin_port = htons(port);
if (bind(pSocket, (struct sockaddr *) &clients, sizeof(clients)) < 0){
printf("Errore durante la connessione della Socket.
Il processo verra chiuso");
return 2; }
S.O. e Reti - Socket 9 di 11 Daniele Contarino
Server
Esercitazione di laboratorio
listen(pSocket, 5);
pSocketClient = accept(pSocket, (struct sockaddr *)
&clientIncoming, sizeof(clientIncoming));
if (pSocketClient < 0) {
printf("Errore durante la connessione del client. Il processo verra chiuso");
return 3;
}
bzero(buffer, 256);
nByte = read(pSocketClient, buffer, 255);
if (nByte < 0){
printf("Errore durante la lettura dei dati dal client. Il processo verra chiuso");
return 4;
}
printf("Messaggio ricevuto: %s\n", buffer);
Server
Esercitazione di laboratorio
nByte = write(pSocketClient, "Ciao Client! :D", 29);
if (nByte < 0){
printf("Errore durante l'invio dei dati al client.
Il processo verra chiuso");
return 5;
}
close(pSocketClient);
close(pSocket);
return 0;
}
S.O. e Reti - Socket