From 7169a2a79f53c408abe7a8979ecfeeb9f4e4cf98 Mon Sep 17 00:00:00 2001 From: Giovanni Di Grezia Date: Tue, 25 Mar 2014 23:54:17 +0100 Subject: [PATCH] Add socket file info on root --- socket.txt | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 socket.txt diff --git a/socket.txt b/socket.txt new file mode 100644 index 0000000..e80a66d --- /dev/null +++ b/socket.txt @@ -0,0 +1,105 @@ +Definizione +Letteralmente significa presa (di corrente). Realizzano l'astrazione di canali +di comunicazione fra due computer connessi da una rete. Una coppia di socket +consente la comunicazione. +Concatenazione di un indirizzo IP e di una porta. Un socket individua +univocamente un processo in esecuzione su un dato host. + +Indirizzo ip +Stringa di 32 bit +Rappresentazione decimale + +Numeri di porta +porta ben note da 0 a 1023 +porta da 1024 a 49151 (possono essere registrate per servizi) +porte dinamiche da 49152 a 65535 (non registrabili, usabili liberamente). + +Socket API +Collezione di strutture dati e di funzioni che permettono al programmatore di +scrivere in modo semplice programmi in grado di comunicare sulla interrete. +Permette di: creare socket - leggere dati - scrivere dati sul canale + +Comunicazione client-server +Client Server +socket() socket() +1.connect() bind() +2.write() listen() +3.read() accept() +4.close() 1. + 2.read() + 3.write() + 4.read() + close() + +Abbiamo le seguenti fasi: +In attesa di una connessione, fase di preparazione (Server) +Scambio di dati Client-Server + +Rappresentazione di un Socket +struct in_addr +struct sockaddr_in { + unit8_t sin_len; + sa_family_t sin_family; //tipo di protocollo + in_port_t sin_port; // 16-bit network byte ordered + struct in_addr sin addr; // struttura indirizzo IP +} +struct sockaddr { + unit8_t sin_len; + sa_family_t sin_family; + char sa_data[14]; +} + +Funzioni principali +#include + + int socket(int family,int type, int protocol) //Definisco il protocollo + return -1 //Error + return Socket descriptor (é come un file descriptor) + + [ int family + AF_INET IPv4 + AF_INET6 IPv6 + AF_LOCAL + AF_ROUTE + altri... + + type + SOCK_STREAM + + protocol + 0 //lascia fare al sistema + ] + +int connect(int sd, struct sockaddr *servaddr, socklen_t addrlen); + + -Permette di aprire una connessione client-server + -Il kernel sceglie una porta e l'indirizzo IP + -Viene effettuata la fase di handshake, in caso di errore ritorna + -ETIMEDOUT //Passa troppo tempo + -ECONNREFUSED //Connessione rifiutata + -EHOSTUNREACH //Host non raggiungibile + + +int bind(int sd, struct sockaddr*myaddr, sockelen_t addrlen); + + -Permette ad un server di assegnare un indirizzo per il server al socket + -Tipo indirizzo: IP - Porta - Entrambi - Nessuno (Sceglie sistema) + -Default : 0 + +int listen(int sd, int backlog); + + -Permette di convertire il socket da attivo a passivo in modo che il kernel + accetti connessioni sul socket + Default socket attivo. + -Permette con backlog di specificare quante connessioni possono essere + attivate + +int accept(int sd, struct sockaddr*cliaddr, socklen_t *addrlen); + + -Permette ad un server di prendere la prima connessione completata dalla coda + Se non ce ne sono si blocca + -addrlen è un parametro valore-risultato + In chiamata contiene il valore della struttura passata + Al ritorno contiene la lunghezza della struttura piena + +A questo punto la connessione è stabilita. Per terminare si utilizza close().