COMUNICAZIONE TRA PROCESSI REMOTI IN UNIX



Похожие документы
IPC Inter Process Communication

I Socket. Laboratorio Software M. Grotto R. Farina

Cenni di programmazione distribuita in C++ Mauro Piccolo

Esercitazione [6] Client/Server con Socket

Esempio 1: stampa locale di file remoto

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

Socket TCP. seconda parte

Introduzione alle applicazioni di rete

DATAGRAM SOCKET. Angelastro Sergio Diomede Antonio Viterbo Tommaso

TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI

unsigned long inet_addr(cp) char *cp;

Socket TCP. prima parte

rsystem Maximiliano Marchesi

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

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

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

Paradigma client-server

Transmission Control Protocol

Controllo Winsock di Visual Basic

Reti di Telecomunicazione Lezione 6

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

PARTE 1 richiami. SUITE PROTOCOLLI TCP/IP ( I protocolli di Internet )

Una semplice applicazione client/server 1

I/O su Socket TCP: read()

L interfaccia socket

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

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

Interazione (TCP) Client-Server con le socket

MODELLI ISO/OSI e TCP/IP

Gestione degli indirizzi

HTTP adaptation layer per generico protocollo di scambio dati

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

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

Laboratorio di Programmazione in Rete

Architettura del. Sintesi dei livelli di rete. Livelli di trasporto e inferiori (Livelli 1-4)

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

Standard per Reti a Commutazione di Pacchetto Prof. Vincenzo Auletta Università degli studi di Salerno Laurea in Informatica

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

Interprocess Communications - II. Franco Maria Nardini

Protocolli di Comunicazione

Sistemi Operativi (modulo di Informatica II)

Inizializzazione degli Host. BOOTP e DHCP

Gestione degli indirizzi

Le reti. Introduzione al concetto di rete. Classificazioni in base a

Reti di Telecomunicazione Lezione 8

Standard di comunicazione

Elementi di Informatica e Programmazione

CORSO DI RETI SSIS. Lezione n.2. 2 Novembre 2005 Laura Ricci

Informatica per la comunicazione" - lezione 8 -

Reti (già Reti di Calcolatori )

Internet e protocollo TCP/IP

Reti di Telecomunicazioni Mobile IP Mobile IP Internet Internet Protocol header IPv4 router host indirizzi IP, DNS URL indirizzo di rete

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

Reti di Calcolatori. Il software

Esercizio 2. Client e server comunicano attraverso socket TCP

Esercitazione [7] Client/Server con Socket

Esercitazione [5] Input/Output su Socket

SISTEMI OPERATIVI DISTRIBUITI

Una prima applicazione in C per l utilizzo delle socket

Corso di Sistemi di Elaborazione delle informazioni. Reti di calcolatori 2 a lezione a.a. 2009/2010 Francesco Fontanella

Telematica II 12. Esercitazione/Laboratorio 4

Creare una applicazione Winsock di base

Reti di Calcolatori. una rete di calcolatori è costituita da due o più calcolatori autonomi che possono interagire tra di loro una rete permette:

Computazione multi-processo. Condivisione, Comunicazione e Sincronizzazione dei Processi. Segnali. Processi e Threads Pt. 2

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

Introduzione. Livello applicativo Principi delle applicazioni di rete. Stack protocollare Gerarchia di protocolli Servizi e primitive di servizio 2-1

Approfondimento di Marco Mulas

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

Programmazione dei socket con TCP #2

Insegnamento di Informatica CdS Scienze Giuridiche A.A. 2007/8

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

ESERCIZI DI PROGRAMMAZIONE C IN AMBIENTE UNIX

Creare un'elementare backdoor in C in ambiente UNIX

Protocolli applicativi: FTP

Identità sulla rete protocolli di trasmissione (TCP-IP) L architettura del sistema. Dal livello A al livello B

Antonio Cianfrani. Extended Access Control List (ACL)

Sincronizzazione e comunicazione tra processi in Unix. usati per trasferire ad un processo l indicazione che un determinato evento si è verificato.

Транскрипт:

A cura del prof. Gino Tombolini 1 COMUNICAZIONE TRA PROCESSI REMOTI IN UNIX Il sistema UNIX TCP/IP fornisce un meccanismo di comunicazione tra processi residenti su nodi distinti di una rete, compatibili con i meccanismi da usarsi nell'ipc locale. Unix fornisce una interfaccia indipendente dall'architettura di rete utilizzata. Incorpora nel sistema un meccanismo adatto a fornire il supporto alla condivisione di risorse in un ambiente distribuito senza dover realizzare un nuovo sistema operativo distribuito. Fornisce un meccanismo di comunicazione tra processi sia locali che remoti che rappresenta una generalizzazione del meccanismo delle pipe insito in Unix. La generalizzazione dipende dal fatto che il sistema deve poter utilizzare diverse architetture di rete, con diversi insiemi di protocolli, diversi hardware, diverse convenzioni relative alla specifica dei nomi, da assegnare a ciascun elemento che può scambiare dati. Occorre definire il dominio di comunicazione che rappresenta la tipologia della comunicazione (locale o remota) e la tecnica di denominazione dei nodi comunicanti. Il dominio di comunicazione deve ovviamente essere parametrico rispetto alla particolare architettura di rete in cui operiamo. Il protocollo deve fornire una nuova astrazione per denotare i punti terminali di un canale di comunicazione bidirezionale. Questa nuova astrazione è data dai socket (Unix BSD). Il socket è il terminale virtuale di un canale di comunicazione bidirezionale, qualcosa di simile alla presa telefonica senza la quale non è possibile alcuna comunicazione. Creazione di un socket. Un socket può essere creato con una apposita primitiva in cui occorre specificare per quale dominio di comunicazione (architettura di rete) è valido il socket (ad esempio se lo creiamo per l'architettura Internet avrà una certa struttura, diversa per architetture diverse). Il controllo della semantica (cioè del tipo di comunicazione da instaurare) è reso disponibile al programma in maniera consistente a tutti i domini di comunicazione. Esempio se siamo in ambiente Internet potremmo voler creare una comunicazione di tipo TCP o UDP. Occorre definire anche il tipo di socket che denota lo stile della comunicazione (es. connection oriented o datagram connection-less). La primitiva per creare un socket : sd = socket(dominio, tipo, protocollo); int sd, dominio, tipo, protocollo; sd = descrittore di socket dominio = denota il particolare dominio di comunicazione tipo = denota il tipo di comunicazione (tipo circuito virtuale o datagram) protocollo = uno dei protocolli supportati dal dominio (0=default), normalmente ce n'è uno solo I domini di comunicazione Unix sono : AF_UNIX = identifica una comunicazione locale AF_INET = identifica una comunicazione remota usando i protocolli TCP/IP I tipi di socket (ad esempio per AF_INET) sono : SOCK_STREAM = trasferimento affidabile di sequenze di byte SOCK_SEQPACKET =trasferimento affidabile di pacchetti SOCK_DGRAM = trasferimento non affidabile di tipo datagram UDP SOCK_RAW = accesso diretto ai protocolli di basso livello

A cura del prof. Gino Tombolini 2 Un esempio di dominio AF_INET OSI UNIIX BSD ESEMPIO LIV. 7 LIV. 6 PROGRAMMA TELNET LIV. 5 SOCKET SOCK_STREAM LIV. 4 PROTOCOLLI TCP LIV. 3 IP LIV. 2 DRIVER DI RETE DRIVER DI RETE LIV. 1 HARDWARE ETHERNET (FTP) MAIL Associazione socket - indirizzo Una volta che il socket è stato creato occorre legare il socket ad un ben preciso indirizzo. Questo si fa con la primitiva bind. Se il socket è simile alla presa telefonica, la bind è simile al numero telefonico con cui individuare le utenze. error=bind(sd, ind, lun); int error, sd, lun; struct sockaddr *ind; sd= descrittore di socket, ind=indirizzo ad esempio Internet attraverso il quale il socket sarà conosciuto lun=lunghezza dell'indirizzo (in tal modo si ha la dovuta generalità per le diverse architetture) l'indirizzo ha poi una struttura che dipende dall'architettura usata (es. in Internet è dato dall'indirizzo porta e indirizzo host, mentre in Unix è un pathname). Il formato degli indirizzi è il seguente : sa_family sa_data 2byte variabile Per AF_UNIX il formato è quello del nome di un file (pathname) e la dimensione max è di 128 byte Per AF_INET il formato è quello Internet (32bit x host + 16bit x porta) struttura sock_addr_in sa_family sin_port sin_addr sin_zero (per compatib.) AF_INET 2 byte 2byte 4 byte 8 byte short u_short struct in_addr char[8] Un tipico esempio tra processi remoti è la comunicazione client-server : CLIENT SERVER send(richesta) receive(risultati) receive(richiesta) elabora send(risultati)

A cura del prof. Gino Tombolini 3 Comunicazione connection oriented Per instaurare una comunicazione di tipo connection oriented tra due processi (client e server) occorre effettuare le seguenti operazioni : 1. Client e server creano ognuno il proprio socket e definiscono l indirizzo (socket e bind); il server deve definire una coda di richieste di connessione e attendere l arrivo delle richieste stesse; 2. deve essere creata una connessione (circuito virtuale) tra i due socke, cioè il client richiede la connessione al server; 3. i processi possono ora comunicare; quando la richiesta viene accettata dal server, la connessione è in atto. Server Client bind() bind() (qui la bind non è indispensabile) listen() connect() accept()... attesa... read() write()... write() read() La primitiva listen() permette di definire una coda con ben precise dimensioni nella quale vengono accodate richieste di connessione provenienti dal client. La primitiva accept() accetta richieste dai client, il server va in attesa fino all arrivo delle richieste (stato di blocco del server); quando arrivano richieste il server legge (primitiva read) le richieste, le elabora ed invia i risultati ai client (primitiva write). error = listen(sd, dim); int error, sd, dim; crea una coda in cui inserisce le richieste di connessione dai client; la coda può essere lunga al massimo dim richieste. nuovo_sd = accept(sd, ind, lun); int nuovo_sd, sd, lun; struct sockaddr *ind; ind può restituire l indirizzo del socket del processo mittente e lun la sua lunghezza; nuovo_sd rappresenta un secondo descrittore del circuito virtuale che si è instaurato quando arriva la richiesta; in pratica viene creato un nuovo socket di lavoro che può servire al processo figlio attivato per la gestione della connessione attuale, mentre il processo padre torna ad attendere nuove richieste di connessione in parallelo al processo figlio. error = connect(sd, ind, lun); int error, sd, lun;

A cura del prof. Gino Tombolini 4 struct sockaddr *ind; sd è il socket locale; ind è l indirizzo del socket del server remoto; lun è la lunghezza di tale indirizzo. Una volta completata la connessione, si possono usare le normali procedure read() e write(). cont=read(sd, buf, lun); oppure cont=write(sd, buf, lun); Per eliminare la trasmissione o la ricezione ad un socket si può utilizzare la primitiva shutdown() (sconnessione senza distruzione del socket. Per eliminare il socket può essere utilizzata la primitiva close(). Esempio SERVER (non crea nessun processo figlio) main() {... s=socket(af_inet, SOCK_STREAM,0); <preparazione nella struttura nome dell indirizzo del server> bind(s, &nome,sizeof(nome)); listen(s, 10); for(;;) { d=accept(s,0,0); m=read(d, buf, sizeof(buf)); close(d); Esempio CLIENT main() {... s=socket(af_inet, SOCK_STREAM,0); <preparazione nella struttura nome dell indirizzo del client> bind(s, &nome,sizeof(nome)); <preparazione nella struttura nomes dell indirizzo del server> connect(s, &nomes, sizeof(nomes));. write(s, buf, sizeof(buf));. read(s, buf, sizeof(buf)); close(s); Comunicazione Datagram.

A cura del prof. Gino Tombolini 5 In questo caso non viene creata una connessione tra client e server. le fasi sono quindi : 1. client e server devono creare il proprio socket e definirne l indirizzo (socket e bind); 2. i processi possono comunicare specificando per ogni messaggio il socket destinatario. Si hanno a disposizione due primitive recvfrom() e sendto() con funzionamento analogo alle read e write, in cui occorre però anche specificare dei parametri aggiuntivi che denotano indirizzo e lunghezza della struttura socket ricevente (sendto) o trasmittente (recvfrom). Server Client bind() bind() recvfrom() sendto().... ricezione ed elab.... sendto() recvfrom()... /* CLIENT.C */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <netdb.h> #define PORTNUM 601 main(argc, argv) int argc; char *argv[]; { int s; struct sockaddr_in sin; struct hostent *hp; char buf[80]; if(argc!=2) { printf("numero di argomenti errato"); if((hp=gethostbyname(argv[1]))==0) { perror("errore: gethostbyname"); bzero(&sin,sizeof(sin)); bcopy(hp->h_addr,&sin.sin_addr,hp->h_length); sin.sin_family=hp->h_addrtype; sin.sin_port=portnum; if((s=socket(af_inet, SOCK_STREAM,0))==-1) { perror("errore: socket"); if (connect(s,&sin,sizeof(sin),0)==-1) { perror("errore: connect"); /*sprintf(buf,"hello world");*/ gets(buf); if(write(s,buf,sizeof(buf))==-1) { perror("errore: write"); close(s); /* SERVER */

A cura del prof. Gino Tombolini 6 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <netdb.h> #define PORTNUM 601 main(argc, argv) int argc; char *argv[]; { int s, ns, pid; struct sockaddr_in sin; char buf[80]; if((s=socket(af_inet, SOCK_STREAM,0))==-1) { perror("errore: socket"); bzero(&sin,sizeof(sin)); sin.sin_port=portnum; if (bind(s,&sin,sizeof(sin))==-1) { perror("errore: bind"); if (listen(s,5)==-1) { perror("errore: listen"); while(1) { if((ns=accept(s,0,0))==-1) { perror("errore: accept"); if((pid=fork())==-1){ perror("errore: fork"); if(pid==0) { while(1) { if((pid=read(ns,buf,sizeof(buf)))==-1){ perror("errore: read"); if(pid<sizeof(buf)) break; printf("dati dal client : %s",buf); printf("\n Processo figlio terminato \n"); close(ns); exit(0);