Laboratorio reti AA 2008/2009. Dott. Matteo Roffilli Ricevimento in ufficio dopo la lezione

Documenti analoghi
LABORATORIO di Reti di Calcolatori

Reti (già Reti di Calcolatori )

Esercitazione [6] Client/Server con Socket

Interazione (TCP) Client-Server con le socket

Socket TCP. prima parte

Programmazione socket. Queste slide sono distribuite con licenza Creative Commons Attribuzione-Non commerciale-condividi allo stesso modo 2.

Socket per TCP: Fondamenti

Introduzione ai socket

Una semplice applicazione client/server 1

Socket. Nei sistemi operativi moderni i servizi disponibili in rete si basano principalmente sul modello client/server.

IPC Inter Process Communication

Internetworking with TCP/IP (Douglas E. Comer) Vol. I and Vol III.

Sviluppo di Applicazioni su Rete. Introduzione all API socket di Berkeley. Interazione tra Processi. Modello Client-Server

Programmazione di applicazioni di rete

Socket. Nei sistemi operativi moderni i servizi disponibili in rete si basano principalmente sul modello client/server.

Scrittura dei programmi applicativi di rete

Programmazione dei socket di rete in GNU/Linux

COMUNICAZIONE TRA PROCESSI REMOTI IN UNIX

funzione fork() La funzione fork è usata per duplicare un processo. #include <unistd.h> pid_t fork (void);

Server Iterativi. Server TCP Ricorsivi. Fork. Server Ricorsivi. un server iterativo gestisce una connessione alla volta. Prof.

request reply richiesta client processo di servizio processo server principale From - Valeria Cardellini, Corso Sist. Distr. A.A.

I Socket. Laboratorio Software M. Grotto R. Farina

TECN.PROG.SIST.INF. TCP socket in Windows Roberta Gerboni

DATAGRAM SOCKET. Angelastro Sergio Diomede Antonio Viterbo Tommaso

Una socket è un punto estremo di un canale di comunicazione accessibile mediante un file descriptor. Alcuni tipi predefiniti di socket

INTERNET DOMAIN SOCKETS (Cap.59)

Esercitazione di Lab. di Sistemi Operativi 1 a.a. 2011/ Comunicazione Tra Processi (IPC) Parte -

SC per Inter Process Comminication. Comunicazione fra macchine diverse: socket

Creare una applicazione Winsock di base

Program m azione di Sistem a 6

Un server di posta (che usa il protocollo SMTP) è identificato dal numero di porta 25.

L interfaccia socket

Sistemi di Elaborazione. Introduzione alla Programmazione distribuita

Scrittura dei programmi applicativi di rete

Inter-process communication: socket

Socket per TCP: Fondamenti

programmazione distribuita Introduzione Introduzione alla programmazione distribuita

Laboratorio di Sistemi Operativi Cognome Nome Mat.

rsystem Maximiliano Marchesi

Socket TCP. seconda parte

Guida all' uso dei sockets nella programmazione in C

C: panoramica. Violetta Lonati

Cenni di programmazione distribuita in C++ Mauro Piccolo

Progettazione di un client TCP. Progettazione di un server TCP. Esempio: daytime TCP. Client TCP daytime

Laboratorio di Reti di Calcolatori

funzione close() La funzione close è utilizzata normalmente per chiudere un descrittore di file, è utilizzata per chiudere un socket e terminare una

Socket per TCP: Fondamenti

Esempio 1: stampa locale di file remoto

I/O su Socket TCP: read()

Laboratorio di Reti di Calcolatori

IPC: InterProcess Communication

Creare un'elementare backdoor in C in ambiente UNIX

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ&

L uso di Socket UDP. TCP vs. UDP UDP

I Socket di Berkeley

Lo strato di applicazione in Internet

*HVWLRQHDYDQ]DWDGHOOH6RFNHWLQ& ODSULPLWLYDVHOHFW

Reti di Calcolatori - Laboratorio. Lezione 5. Gennaro Oliva

Introduzione alla programmazione C di socket

La programmazione di rete

Laboratorio di Programmazione in Rete

Elementi di programmazione con interfaccia Socket

SERVER CLIENT. Struttura di un Applicazione UDP. Socket UDP. Parametri di sendto. Funzioni di Input/Output. Prof. Vincenzo Auletta

Programmazione di applicazioni di rete con socket - parte 1

Il modello Client/Server. La comunicazione

Esercitazione di Lab. di Sistemi Operativi 1 a.a. 2011/ Comunicazione Tra Processi (IPC)- - 1 Parte -

Socket per TCP: Fondamenti

Esempio 1: stampa locale di file remoto

Socket I MIDLAB. Sirio Scipioni. M I D L A B

Acknowledgment: Prof Vincenzo Auletta, Università di Salerno. Approfondimento alla programmazione distribuita

Laboratorio di. Reti Informatiche. Corso di Laurea Triennale in Ingegneria Informatica A.A. 2017/2018. Ing. Carlo Vallati

Funzioni bloccanti e soluzioni

Le Opzioni per i Socket

Program m azione di Sistem a 6a

Applicazione distribuita

Ret e i Inf n o f rm r a m t a ich c e Terza esercitazione

Laboratorio di Reti di Calcolatori

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Basi di network programming sotto Unix/Linux (draft version) Claudio Piciarelli

Paradigma client-server

Corso di Sistemi Operativi Esercitazioni

Problema. I/O Multiplexing. Struttura delle Operazioni di Lettura. Modelli di I/O. Prof. Vincenzo Auletta

Funzioni bloccanti e soluzioni. Funzioni bloccanti e soluzioni (2) Parametri della funzione select() Funzione select()

Programmazione di Sistema 5. Pipe e Fifo. IPC: Inter Process Communication. Pipe anonimi e con nome (FIFO) Paolo Baldan

Esercitazione Laboratorio di Sistemi Operativi Cognome Nome Mat.

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Le reti basate su TCP/IP

Corso di Laurea in Ingegneria Informatica. Corso di Reti di Calcolatori a.a. 2009/10

Socket. [Pagina intenzionalmente vuota] 2: Socket ( ) slide 2:1/50 (p.24)

Esercitazione [5] Input/Output su Socket

File binari e file di testo

Programmazione in Rete

Esempi di Client e Server

Domain Name Service. Mapping nomi/indirizzi con Socket API in C

Il linguaggio C. Puntatori e dintorni

Capitolo 5 -- Stevens

Laboratorio di Programmazione in Rete

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Applicazione Client-Server con Server Concorrente Specifiche

Transcript:

Laboratorio reti AA 2008/2009 Dott. Matteo Roffilli roffilli@csr.unibo.it Ricevimento in ufficio dopo la lezione 1

Laboratorio reti AA 2008/2009 Per esercitarvi fate SSH su: alfa.csr.unibo.it si-tux00.csr.unibo.it. si-tux15.csr.unibo.it Eventuali variazioni di orario/giorno verranno comunicate in anticipo via mail. 2

Laboratorio reti AA 2008/2009 Marzo 5 Intro,SSH,VI/VIM,GCC base 12 Richiami di C e Compilazione 19 Socket e Co. 26 Socket e Co. parte seconda Aprile 2 Client Fine prima parte. Si riprende il 23 Aprile. Controllate sempre il portale di CSR. 3

Esempio #1 void main(void) { int sockfd; struct sockaddr_in Serv;... /* prende un socket per stream TCP */ socketfd=socket(pf_inet,sock_stream,0); 2 /* specifica l'indirizzo TCP/IP del server remoto */ Serv.sin_family=AF_INET; Serv.sin_addr.s_addr=inet_addr(char*_IP); Serv.sin_port = htons(int_port);... } 2 IP/port 4

connect La funzione connect è usata da un client IP per stabilire la connessione con un server IP. #include <sys/socket.h> int connect( int sockfd, const struct sockaddr* servaddr, socklen_t addrlen ) 5

connect La funzione restituisce: 0 in caso di successo -1 per un errore, nel qual caso errno assumerà i valori: ECONNREFUSED non c'è nessuno in ascolto sull'indirizzo remoto. ETIMEDOUT si è avuto timeout durante il tentativo di connessione. ENETUNREACH la rete non è raggiungibile. EINPROGRESS il socket è non bloccante e la connessione non può essere conclusa immediatamente. EALREADY il socket è non bloccante e un tentativo precedente di connessione non si è ancora concluso. EAGAIN non ci sono più porte locali libere. EAFNOSUPPORT l'indirizzo non ha una famiglia di indirizzi corretta nel relativo campo. EACCES, EPERM si è tentato di eseguire una connessione ad un indirizzo broadcast senza che il socket fosse stato abilitato per il broadcast. altri errori possibili sono: EFAULT, EBADF, ENOTSOCK, EISCONN e EADDRINUSE. 6

sockaddr vs sockaddr_in Le funzioni che utilizzeremo richiedono esplicitamente di tipizzare alcuni dati come strutture: sockaddr Nel Laboratorio precedente abbiamo visto invece la definizione della struttura sockaddr_in Un puntatore a quest ultima può essere castato senza problemi ad un puntatore alla prima con (struct sockaddr*) in quanto è stata creata appositamente. Infatti la sockaddr_in è derivata dalla sockaddr per essere utilizzata nel dominio IPv4. Ad esempio esistono anche le strutture derivate: struct sockaddr_in6, sockaddr_ipx, struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address (IP) */ }; 7

socklen_t Specifica la dimensione della struttuta passata come argomento. E buona norma calcolarlo a run-time in quanto alcuni tipi potrebbero avere dimensioni differenti su architetture diverse. Per calcolare la dimensione in byte di una struttura si usa l operatore: Esempio: size_t sizeof(); struct sockaddr_in serv; sizeof(serv); 8

Esempio #2 void main(void) { int sockfd; struct sockaddr_in Serv; int ris; /* prende un socket per stream TCP */ socketfd=socket(pf_inet,sock_stream,0); /* specifica l'indirizzo TCP/IP del server remoto */ Serv.sin_family=AF_INET; Serv.sin_addr.s_addr=inet_addr(char*_IP); Serv.sin_port = htons(int_port); ris = connect(socketfd, (struct sockaddr*) &Serv, sizeof(serv)); } 2 IP/port HOST 9

close La funzione standard Unix close che si usa sui file può essere usata con lo stesso effetto anche sui file descriptor associati ad un socket. #include <unistd.h> int close(int fd); La funzione restituisce: 0 in caso di successo -1 per un errore, nel qual caso bisogna controllare errno L'azione di questa funzione quando applicata a socket è di marcarlo come chiuso e ritornare immediatamente al processo. Una volta chiamata il socket descriptor non è più utilizzabile dal processo e non può essere usato come argomento per una write o una read (anche se l'altro capo della connessione non avesse chiuso la sua parte). Il kernel invierà comunque tutti i dati che ha in coda prima di iniziare la sequenza di chiusura. 10

Esempio #3 void main(void) { /* specifica l'indirizzo TCP/IP del server remoto */ Serv.sin_family=AF_INET; Serv.sin_addr.s_addr=inet_addr(char*_IP); Serv.sin_port = htons(int_port); ris = connect(socketfd, (struct sockaddr*) &Serv, sizeof(serv)); /* chiusura */ close(socketfd); } IP/port HOST 11

bind La funzione bind assegna un indirizzo locale ad un socket. È usata cioè per specificare la prima parte dalla socket pair. Viene usata di solito sul lato server per specificare la IP e porta su cui poi ci si porrà in ascolto. Il prototipo della funzione è il seguente: #include <sys/socket.h> int bind( int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen ) 12

un indirizzo locale I processi comunicano verso l esterno tramite le socket. Il protocollo PF_INET (IPv4) comunica tramite indirizzi di tipo IP:porta (es.137.204.72.5:80). Per permettere ad un processo di comunicare con un altro tramite il protocollo PF_INET bisogna collegare un indirizzo locale (cioè della macchina su cui il processo gira) di tipo AF_INET ad una socket aperta dal processo. La bind fa esattamente questo! Lato server questo linking è necessario mentre lato client è opzionale (se non specificato ci pensa in automatico la connect). 13

bind La funzione restituisce: 0 in caso di successo -1 per un errore, nel qual caso errno assumerà i valori: EBADF il file descriptor non è valido. EINVAL il socket ha già un indirizzo assegnato. ENOTSOCK il file descriptor non è associato ad un socket. EACCES si è cercato di usare una porta riservata senza sufficienti privilegi. EADDRNOTAVAIL Il tipo di indirizzo specificato non è disponibile. EADDRINUSE qualche altro socket sta già usando l'indirizzo. ed anche EFAULT e per i socket di tipo AF_UNIX, ENOTDIR, ENOENT, ENOMEM, ELOOP, ENOSR e EROFS. 14

Esempio #4 void main(void) { int sockfd,ris; struct sockaddr_in Serv,Local; /* prende un socket per stream TCP */ socketfd=socket(pf_inet,sock_stream,0); /* name the socket */ memset ( &Local, 0, sizeof(local)); Local.sin_family=AF_INET; Local.sin_addr.s_addr=htonl(INADDR_ANY); Local.sin_port=htons(local_port_number); ris = bind(socketfd, (struct sockaddr*) &Local, sizeof(local)); } 4 15

listen La funzione listen serve ad usare un socket in modalità passiva, cioè, come dice il nome, per metterlo in ascolto di eventuali connessioni; in sostanza l'effetto della funzione è di portare il socket dallo stato CLOSED a quello LISTEN. In genere si chiama la funzione in un server dopo le chiamate a socket e bind e prima della chiamata ad accept. #include <sys/socket.h> int listen(int sockfd, int backlog) backlog specifica la dimensione del buffer della listen e per i nostri scopi si può mettere fisso a 10. La funzione restituisce: 0 in caso di successo -1 per un errore, nel qual caso errno assumerà i valori: EBADF l'argomento sockfd non è un file descriptor valido. ENOTSOCK l'argomento sockfd non è un socket. EOPNOTSUPP il socket è di un tipo che non supporta questa operazione. 16

Esempio #5 void main(void) { int sockfd,ris; struct sockaddr_in Serv,Local; /* prende un socket per stream TCP */ socketfd=socket(pf_inet,sock_stream,0); ris = bind(socketfd, (struct sockaddr*) &Local, sizeof(local)); ris = listen(socketfd, 10 ); } 4 17

accept La funzione accept è chiamata da un server per gestire la connessione una volta che sia stato completato il three way handshake, la funzione restituisce un nuovo socket descriptor su cui si potrà operare per effettuare la comunicazione. Se non ci sono connessioni completate il processo viene messo in attesa. I due argomenti addr e addrlen (si noti che quest'ultimo è passato per indirizzo per avere indietro il valore) sono usati per ottenere l'indirizzo del client da cui proviene la connessione. Prima della chiamata addrlen deve essere inizializzato alle dimensioni della struttura il cui indirizzo è passato come argomento in addr; al ritorno della funzione addrlen conterrà il numero di byte scritti dentro addr. #include <sys/socket.h> int accept( int sockfd, struct sockaddr* addr, socklen_t* addrlen) 18

accept La funzione restituisce: >0 in caso di successo (l identificativo del socket descriptor) -1 per un errore, nel qual caso errno assumerà i valori: EBADF l'argomento sockfd non è un file descriptor valido. ENOTSOCK l'argomento sockfd non è un socket. EOPNOTSUPP il socket è di un tipo che non supporta questa operazione. EAGAIN o EWOULDBLOCK il socket è stato impostato come non bloccante e non ci sono connessioni in attesa di essere accettate. EPERM, ENOBUFS, ENOMEM,EINTR, EMFILE, EINVAL, ENOSR, ENOBUFS, EFAULT, EPERM, ECONNABORTED, ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT, ERESTARTSYS. 19

Esempio #6 void main(void) { int sockfd,ris,newsocketfd; struct sockaddr_in Serv,Local,Client; int len; /* prende un socket per stream TCP */ socketfd=socket(pf_inet,sock_stream,0); ris = bind(socketfd, (struct sockaddr*) &Local, sizeof(local)); ris = listen(socketfd, 10 ); len=sizeof(client); newsocketfd = accept(socketfd,(struct sockaddr*)&client, &len); } socket 2 socket Server IP/port port 6 20

Visione generale server client 154.203.25.7:2027 137.204.72.5:80 HOST HOST 2 socket IP +port IP +port socket 6 21

Controllo errori int main(int argc, char* argv[]) { int sock_fd, i; struct sockaddr_in serv_add;... /* create socket */ if ( (sock_fd = socket(pf_inet, SOCK_STREAM, 0)) < 0) { perror("socket creation error"); return -1; }... } 22

E ora puntatori! Goal: realizzare un programma che legge a riga di comando il numero di elementi da inserire, richiede gli elementi (numeri interi di tipo long) e stampa a video la loro somma Requisiti: 1. Lo spazio per memorizzare i numeri richiesti deve essere allocato dinamicamente. 2. L allocazione di memoria deve essere controllata. 3. L accesso ai numeri deve utilizzare l aritmetica dei puntatori 4. Il programma deve essere compilato, linkato e deve funzionare!!! Tempo a disposizione: 25 minuti 23

Soluzione #include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { long* buffer; int num,i,somma=0; if(argc!=2) exit(exit_failure); num=atoi(argv[1]); buffer=(long*)malloc(num*sizeof(long)); if(buffer==null) exit(exit_failure); for(i=0;i<num;i++) *(buffer+i)=0; for(i=0;i<num;i++) { scanf("\n%ld",buffer+i); somma+=*(buffer+i); } free(buffer); printf("\nsomma=%d\n",somma); return 0; } 24