Laboratorio reti AA 2006/2007. Dott. Matteo Roffilli Ricevimento in ufficio dopo la lezione

Documenti analoghi
Laboratorio reti AA 2007/2008. Dott. Matteo Roffilli Ricevimento in ufficio dopo la lezione

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

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

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

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

LABORATORIO di Reti di Calcolatori

Esercitazione [7] Client/Server con Socket

Laboratorio reti AA 2006/2007. Dott. Matteo Roffilli Ricevimento in ufficio dopo la lezione

LABORATORIO di Reti di Calcolatori

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

Esercitazione [6] Client/Server con Socket

Reti (già Reti di Calcolatori )

Introduzione ai socket

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

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

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

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

Laboratorio di. Reti Informatiche. Corso di Laurea Triennale in Ingegneria Informatica A.A. 2016/2017. Ing. Niccolò Iardella

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

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

Programmazione di Rete

Socket TCP. prima parte

Interazione (TCP) Client-Server con le socket

SCUOLA DI INGEGNERIA DELL INFORMAZIONE. Corso di Piattaforme Software per la rete MODULO 2 Anno Accademico Prof. William FORNACIARI

Laboratorio di. Reti Informatiche. Corso di Laurea Triennale in Ingegneria Informatica A.A. 2016/2017. Ing. Niccolò Iardella

Interazione (TCP) Client-Server con le socket

I/O su Socket TCP: read()

Sistemi di Elaborazione. Introduzione alla Programmazione distribuita

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

API Socket di Berkeley

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

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

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

Programmazione di applicazioni di rete

Politecnico di Milano FACOLTÀ DI INGEGNERIA DELL INFORMAZIONE. Prof. William FORNACIARI

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

I.I.S. G.B. PENTASUGLIA MATERA ISTITUTO TECNICO SETTORE TECNOLOGICO LICEO SCIENTIFICO SCIENZE APPLICATE. Classe: 5Ci

Reti Informatiche. Quarta esercitazione

Laboratorio di Programmazione in Rete

Socket per TCP: Fondamenti

Laboratorio Reti di Calcolatori (A.A ) Delfina Malandrino.

Scrittura dei programmi applicativi di rete

*HVWLRQHDYDQ]DWDGHOOH6RFNHWLQ& ODSULPLWLYDVHOHFW

Corso di Laboratorio di Sistemi Operativi A.A

Funzioni bloccanti e soluzioni

Reti di Calcolatori - Laboratorio. Lezione 5. Gennaro Oliva

Programmazione di applicazioni di rete con socket - parte 1

Il modello Client/Server. La comunicazione

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

COMUNICAZIONE TRA PROCESSI REMOTI IN UNIX

Programmazione dei socket di rete in GNU/Linux

C: panoramica. Violetta Lonati

RETI DI CALCOLATORI. Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI. Facoltà di Ingegneria Università degli Studi di Udine

Laboratorio di. Reti Informatiche. Corso di Laurea Triennale in Ingegneria Informatica A.A. 2016/2017. Ing. Niccolò Iardella

IPC Inter Process Communication

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

I Socket di Berkeley

Esempio 1: stampa locale di file remoto

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

(VHUFLWD]LRQLGLEDVHVXOOH6RFNHWLQ&

Lo strato di applicazione in Internet

Implementazione di un server. Server iterativo. Offro servizio ad un client alla volta. Dobbiamo scrivere un programma in C che offre un servizio

Sistemi Operativi (M. Cesati)

Una semplice applicazione client/server 1

Esercitazione [08] Server multi-process/multi-thread

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

DATAGRAM SOCKET. Angelastro Sergio Diomede Antonio Viterbo Tommaso

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

Laboratorio di Sistemi Operativi

P3-05: Socket Options

Comunicazioni fra processi remoti: i socket nello UNIX di Berkeley

L interfaccia socket

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

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

Socket per TCP: Fondamenti

Laboratorio di Reti di Calcolatori

Passare argomenti al programma

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

Socket TCP. seconda parte

Program m azione di Sistem a 6

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

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

L uso di Socket UDP. Usiamo le API Winsock incluse in <Winsock.h> A.A. 2005/06. Dott.ssa Valeria Carofiglio

Creare un'elementare backdoor in C in ambiente UNIX

LABORATORIO di Reti di Calcolatori

Creare una applicazione Winsock di base

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

Transcript:

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

Laboratorio reti AA 2006/2007 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 2006/2007 Marzo 6 Intro,SSH,VI/VIM,GCC base 19 Richiami di C e Compilazione 26 Socket e Co. Aprile 3 Socket e Co. parte seconda 3

Esempio #1 void main(void) int sockfd; struct sockaddr_in Serv;... /* prende un socket per stream TCP */ socketfd=socket(af_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 TCP per stabilire la connessione con un server TCP. #include <sys/socket.h> int connect( int sockfd, const struct sockaddr *servaddr, socklen_t addrlen) La funzione restituisce zero in caso di successo e -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 5 EADDRINUSE.

Esempio #2 void main(void) int sockfd; struct sockaddr_in Serv; int ris; /* prende un socket per stream TCP */ socketfd=socket(af_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 6

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); 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. 7

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 8

bind La funzione bind assegna un indirizzo locale ad un socket. È usata cioè per specificare la prima parte dalla socket pair. Viene usata sul lato server per specificare la porta (e gli eventuali indirizzi locali) 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) La funzione restituisce 0 in caso di successo e -1 per un errore; in caso di errore la variabile errno viene impostata secondo i seguenti codici di errore: 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. 9

Esempio #4 void main(void) int sockfd,ris; struct sockaddr_in Serv,Local; /* prende un socket per stream TCP */ socketfd=socket(af_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 10

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) La funzione restituisce 0 in caso di successo e -1 in caso di errore. I codici di errore restituiti in errno sono i seguenti: 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. 11

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

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. #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) La funzione restituisce un numero di socket descriptor positivo in caso di successo e -1 in caso di errore, nel qual caso errno viene impostata ai seguenti 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 Le regole del firewall non consentono la connessione. ENOBUFS, ENOMEM questo spesso significa che l'allocazione della memoria è limitata dai limiti sui buffer dei socket, non dalla memoria di sistema. EINTR La funzione è stata interrotta da un segnale. Inoltre possono essere restituiti gli errori di rete relativi al nuovo socket, diversi a secondo del protocollo, come: EMFILE, EINVAL, ENOSR, ENOBUFS, EFAULT, EPERM, ECONNABORTED, 13 ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT, ERESTARTSYS.

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

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

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 16

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; 17