Esercitazione [5] Input/Output su Socket



Похожие документы
Esercitazione [6] Client/Server con Socket

I/O su Socket TCP: read()

Esercitazione [8] Pipe e FIFO

Cenni di programmazione distribuita in C++ Mauro Piccolo

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

Esercizio 2. Client e server comunicano attraverso socket TCP

Gestione dei File in C

Esercizi (1-2): da: TCP/IP Sockets in C (Donahoo-Calvert)

Pronto Esecuzione Attesa Terminazione

Esercitazione [7] Client/Server con Socket

HTTP adaptation layer per generico protocollo di scambio dati

1. RETI INFORMATICHE CORSO DI LAUREA IN INGEGNERIA INFORMATICA SPECIFICHE DI PROGETTO A.A. 2013/ Lato client

Programmazione dei socket con TCP #2

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

rsystem Maximiliano Marchesi

Organizzazione Monolitica

DMA Accesso Diretto alla Memoria

Sistemi Operativi (modulo di Informatica II)

Corso di Sistemi Operativi Ingegneria Elettronica e Informatica prof. Rocco Aversa. Raccolta prove scritte. Prova scritta

Introduzione al Linguaggio C

Calcolatori Elettronici Parte X: l'assemblatore as88

IPC System V. Code di messaggi

Introduzione alle applicazioni di rete

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Socket & RMI Ingegneria del Software - San Pietro

Transmission Control Protocol

Informatica - A.A. 2010/11

Files, File I/O, File Sharing. Franco Maria Nardini

SISTEMI OPERATIVI. Sincronizzazione dei processi. Domande di verifica. Luca Orrù Centro Multimediale Montiferru 30/05/2007

Studi di Settore. Nota Operativa 22/4/2013

J+... J+3 J+2 J+1 K+1 K+2 K+3 K+...

Bilanciamento di traffico VoIP su reti wireless

Architettura di un calcolatore

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

Comunicazione. La comunicazione point to point e' la funzionalita' di comunicazione fondamentale disponibile in MPI

Comunicazione tra Computer. Protocolli. Astrazione di Sottosistema di Comunicazione. Modello di un Sottosistema di Comunicazione

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

Registratori di Cassa

Nelle reti di calcolatori, le porte (traduzione impropria del termine. port inglese, che in realtà significa porto) sono lo strumento

Allocazione dinamica della memoria - riepilogo

Guida rapida Vodafone Internet Box

Telematica II 12. Esercitazione/Laboratorio 4

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Funzioni. Il modello console. Interfaccia in modalità console

I Socket. Laboratorio Software M. Grotto R. Farina

Corso di Laurea in Ingegneria Informatica. Corso di Reti di Calcolatori I

UDP. Livello di Trasporto. Demultiplexing dei Messaggi. Esempio di Demultiplexing

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

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

SGATE SPECIFICHE XSD - Revisione /03/2011

Interprocess Communications - II. Franco Maria Nardini

Socket TCP. prima parte

Mac Application Manager 1.3 (SOLO PER TIGER)

Descrizione attività

Drivers. Introduzione Tipologie Struttura Interazione con il kernel

appunti delle lezioni Architetture client/server: applicazioni client

Introduzione al MATLAB c Parte 2

Capitolo 1 Installazione del programma

ARCHIVIA PLUS - ARCHIFILE

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE

Prova di Esame - Rete Internet (ing. Giovanni Neglia) Lunedì 24 Gennaio 2005, ore 15.00

Esercitazione 05. Sommario. Packet Filtering [ ICMP ] Esercitazione Descrizione generale. Angelo Di Iorio (Paolo Marinelli)

La selezione binaria

Test di comunicazione tra due LOGO! 0BA7: Master - Master

Funzioni in C. Violetta Lonati

Inizializzazione degli Host. BOOTP e DHCP

SISTEMI OPERATIVI DISTRIBUITI

LABORATORIO DI SISTEMI

Modulo plug&play MKMB-3-e-3. Interfaccia Modbus/RTU per contatori Iskraemeco MT831 / MT860

Esame di INFORMATICA

MANUALE DEL FLASH POINT MANAGER 19 Luglio 2007 INDEX

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

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

Esercitazione. Formato di compitini e compiti: domande ed esercizi "closed book" G. Ferrari - Reti di calcolatori.

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

Tesina esame Programmazione di Sistemi Mobile realizzata da Roberto Giuliani matricola Sockets e DatagramSocket

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni client

Gui Gu d i a d ra r p a i p d i a V d o a d f a one Int fone In e t r e net rnet Box Key Mini

Транскрипт:

Esercitazione [5] Input/Output su Socket Leonardo Aniello - aniello@dis.uniroma1.it Daniele Cono D'Elia - delia@dis.uniroma1.it Sistemi di Calcolo - Secondo modulo (SC2) Programmazione dei Sistemi di Calcolo Multi-Nodo Corso di Laurea in Ingegneria Informatica e Automatica A.A. 2014-2015

Sommario Soluzione esercizio con più produttori e più consumatori Obiettivi dell esercitazione Descrittori in C Letture e Scritture su file Invio e Ricezione messaggi su socket

Esercizio Many Producers/Many Consumers Estendere il sorgente one_producer_one_consumer.c per farlo funzionare con più produttori e più consumatori Soluzione Più produttori (consumatori) possono trovarsi ad inserire nella (leggere dalla) stessa posizione, con la conseguente perdita (duplicazione*) di entry Realizzare una mutua esclusione per l accesso al buffer (e agli indici di lettura/scrittura) risolve il problema Usare un semaforo binario per i consumatori ed uno per i produttori consente ai produttori di andare in parallelo con i consumatori Le race condition tra produttori e consumatori sono già risolte dagli altri due semafori Codice: many_producers_many_consumers.c * Potrebbe anche verificarsi la perdita di un entry nel caso in cui il read_index venga incrementato due volte: in tal modo un entry verrebbe saltata

Obiettivi Esercitazione [5] Imparare ad effettuare operazioni di input e output usando i descrittori in UNIX Lettura/scrittura su file Invio/ricezioni messaggi su socket

Descrittori in UNIX I file descriptor (FD) sono un astrazione per accedere a file o altre risorse di input/output come pipe e socket Ogni processo ha una tabella dei descrittori associata Standard input 0 Standard output 1 Standard error 2 Le operazioni di apertura (o creazione) di una risorsa di input/output sono legate al tipo della risorsa stessa open() per i file socket() o accept() per le socket pipe() per le pipe (argomento futuro)

Letture con i descrittori La funzione read() è definita in unistd.h ssize_t read(int fd, void *buf, size_t nbyte); o fd: descrittore della risorsa o buf: puntatore al buffer dove scrivere il messaggio letto o nbyte: numero massimo di byte da leggere Ritorna il numero di byte realmente letti, o -1 in caso di errore o Per i file, ritorna 0 in caso di end-of-file o Per le socket, ritorna 0 in caso di connessione chiusa Il buffer deve essere dimensionato per contenere nbyte byte o Tale dimensione dipende dall applicazione Formato del file da leggere Messaggi da scambiare in un protocollo di comunicazione

Letture con i descrittori Gestione degli interrupt L esecuzione della funzione read() ha una certa durata Per i file, richiede il tempo necessario per leggere fino a nbytes byte Per le socket, il tempo necessario dipende dall altro endpoint Nel tempo tra l invocazione ed il termine della read(), la chiamata può essere interrotta da un segnale Se l interruzione avviene prima di riuscire a leggere qualsiasi dato (zero byte letti), la read() ritorna -1 ed errno viene settato a EINTR Se l interruzione avviene dopo aver letto qualche dato (byte letti > zero), la read() ritorna il numero di byte letti fino a quel momento Una corretta implementazione deve riconoscere queste situazioni ed invocare di nuovo la read() per ritentare/completare la lettura

Letture con i descrittori Esempio in C while(<not all bytes have been read>) { // read from fd up to n bytes and store into buf int ret=read(fd,buf,n); // no more bytes to read, quit if (ret==0) break; if (ret==-1) { } if (errno==eintr) continue; /* interrupted before reading any byte, retry */ exit(exit_failure); // an error occurred... } /* if interrupted when less than n bytes were read, pay attention to where to write on buffer on resume */ <do something with read bytes>

Scritture con i descrittori La funzione write() è definita in unistd.h ssize_t write(int fd,const void *buf,size_t nbyte); o fd: descrittore della risorsa o buf: puntatore al buffer contenente il messaggio da scrivere o nbyte: numero massimo di byte da scrivere Ritorna il numero di byte realmente scritti, o -1 in caso di errore Gestione degli interrupt analoga alla read() o In caso di interrupt prima di aver scritto il primo byte, viene ritornato -1 e settato errno a EINTR o In caso di interrupt dopo aver scritto almeno un byte, viene ritornato il numero di byte realmente scritti

Scritture con i descrittori Esempio in C while(<not all bytes have been written>) { // write to fd up to n bytes from buf int ret=write(fd,buf,n); if (ret==-1) { // interrupted before writing any byte, retry if (errno==eintr) continue; } // an error occurred... exit(exit_failure); } /* if interrupted when less than n bytes were written, pay attention to where in the buffer you start reading from on resume */ <do something>

Esercizio: copiare un file in C Sorgente da completare: copy.c Argomenti File sorgente S File destinazione D Dimensione B del batch di lettura/scrittura (opzionale, default 128 byte) Semantica Effettuare una copia di S in D tramite una sequenza di letture da S e scritture in D a blocchi di B byte per volta Esercizio: completare il codice dove indicato Per testare la propria soluzione è disponibile lo script test.sh

Invio e Ricezione messaggi su Socket Scenario: architettura client-server su protocollo TCP Il server è in ascolto su una certa porta nota Il client effettua una connessione verso il server su quella porta Una volta aperta una connessione TCP tra due processi, ogni processo può accedervi tramite un descrittore L invio e la ricezione di messaggi tramite socket vengono gestiti in maniera analoga a write() e read() su file È necessario disporre di un descrittore della socket Lettura e scrittura avvengono a blocchi Ci sono alcune differenze.

Invio messaggi su Socket La funzione send() è definita in sys/socket.h ssize_t send(int fd,const void *buf,size_t n,int flags); o fd: descrittore della socket o buf: puntatore al buffer contenente il messaggio da inviare o n: numero massimo di byte da scrivere o flags: fissato a 0, rende la send() equivalente alla write() Ritorna il numero di byte realmente scritti, o -1 in caso di errore o Default: semantica bloccante Se buffer di invio nel kernel non contiene spazio sufficiente per il messaggio da inviare, rimane bloccata in attesa

Ricezione messaggi su Socket La funzione recv() è definita in sys/socket.h ssize_t recv(int fd,void *buf,size_t n,int flags); o fd: descrittore della socket o buf: puntatore al buffer dove scrivere il messaggio ricevuto o n: numero massimo di byte da leggere o flags: se fissato a 0, la recv() è equivalente alla read() Ritorna il numero di byte realmente letti, o -1 in caso di errore o Ritorna 0 in caso di connessione chiusa o Default: semantica bloccante Se l altro endpoint non invia nulla, rimane bloccata in attesa Trasferisce i dati disponibili fino a quel momento nel buffer del kernel, entro il limite di n bytes, piuttosto che restare in attesa di ricevere l intera quantità specificata

Letture e scritture su Socket Valori di ritorno ed interrupt L analisi e gestione dei valori di ritorno per letture e scritture su socket è più complessa rispetto a quanto visto per i file La send() è analoga alla read(): un segnale può potenzialmente causare un invio parziale di dati, o interrompere la chiamata prima che il primo byte venga transmesso (settando errno ad EINTR) Per la recv(), oltre agli stessi effetti derivanti dalla ricezione di segnali visti per send(), si pone il problema che al momento della chiamata possono essere disponibili meno dati di quelli attesi! Come distinguere questo caso da quello dell interruzione dovuta alla ricezione di un segnale? Come fare quando la dimensione dei dati da ricevere non è nota a priori? In questa esercitazione ci limiteremo a gestire soltanto il caso in cui le chiamate vengono interrotte prima che un byte sia stato letto o scritto

Esercizio proposto: TimeServer Scenario Due processi: un client ed un server Il server è in ascolto in attesa di connessioni TCP Il client si connette al server ed invia un comando Messaggio «TIME» Se il server riceve il messaggio atteso, la risposta conterrà ora e data correnti, altrimenti manderà un messaggio di errore Sorgenti: server.c e client.c Esercizio Completare le parti mancanti, relative all invio/ricezione di messaggi via socket Per l esecuzione, è necessario lanciare client e server su terminali diversi