Una semplice applicazione client/server 1



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

INTERNET DOMAIN SOCKETS (Cap.59)

Cenni di programmazione distribuita in C++ Mauro Piccolo

Reti (già Reti di Calcolatori )

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

I Socket. Laboratorio Software M. Grotto R. Farina

Socket TCP. prima parte

Interazione (TCP) Client-Server con le socket

Elementi di programmazione con interfaccia Socket

DATAGRAM SOCKET. Angelastro Sergio Diomede Antonio Viterbo Tommaso

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

Creare una applicazione Winsock di base

IPC Inter Process Communication

Esercitazione [7] Client/Server con Socket

I/O su Socket TCP: read()

COMUNICAZIONE TRA PROCESSI REMOTI IN UNIX

HTTP adaptation layer per generico protocollo di scambio dati

Introduzione alle applicazioni di rete

Socket TCP. seconda parte

rsystem Maximiliano Marchesi

Paradigma client-server

Interazione con il DNS Conversioni di Nomi ed Indirizzi

appunti delle lezioni Architetture client/server: applicazioni client

Interazione (TCP) Client-Server con le socket

Esercizio 2. Client e server comunicano attraverso socket TCP

Esempio 1: stampa locale di file remoto

Programmazione dei socket con TCP #2

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

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

Socket per TCP: Fondamenti

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

Guida all' uso dei sockets nella programmazione in C

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

Esempi di Client e Server

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

Transmission Control Protocol

Sicurezza delle reti. Monga. Ricognizione. Scanning Breve ripasso socket Network mapping Port Scanning NMAP. Le tecniche di scanning

L interfaccia socket

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

Manuale per la configurazione di AziendaSoft in rete

Interprocess Communications - II. Franco Maria Nardini

Impostazione dell'indirizzo IP del dispositivo di autenticazione di Xerox Secure Access Unified ID System Carta bianca

COSTER. Import/Export su SWC701. SwcImportExport

Servizio on-line di Analisi e Refertazione Elettrocardiografica

Zeroshell: VPN Lan-to-Lan. Il sistema operativo multifunzionale. creato da

Configurazione del servizio Dynamic DNS. Questa procedura ti guiderà durante i 4 passi necessari alla messa in funzione del servizio.

Dal protocollo IP ai livelli superiori

Una prima applicazione in C per l utilizzo delle socket

Veneto Lavoro via Ca' Marcello 67/b, Venezia-Mestre tel.: 041/

Reti di Telecomunicazione Lezione 6

MANUALE DI INSTALLAZIONE DI CISCO VPN CLIENT

Inter-process communication: socket

SPRING SQ COMUNICAZIONE OPERAZIONI IVA NON INFERIORI A 3000 EURO PER L ANNO 2011

Creazione Account PEC puntozeri su Outlook Express

MC-link Lan+ Connessione e configurazione del router PRESTIGE 100

SOMMARIO COSA SERVE... 2 PRIMA DI INIZIARE... 2 COME PROCEDERE LATO SERVER... 3 COME PROCEDERE LATO CLIENT... 3

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

Nuovo server E-Shop: Guida alla installazione di Microsoft SQL Server

Controllo Winsock di Visual Basic

TOOLS DI MONITORAGGIO DI RETE Total Network Monitor

unsigned long inet_addr(cp) char *cp;

Registratori di Cassa

Inizializzazione degli Host. BOOTP e DHCP

Che differenza c è tra una richiesta XML ed una domanda XML? (pag. 4)

Laboratorio di Programmazione in Rete

Università degli Studi di Pisa Dipartimento di Informatica. NAT & Firewalls

Vlan Relazione di Sistemi e Reti Cenni teorici

GENIUSPRO. Installazione del software Installazione del driver Configurazione del software Registrazione Attivazione

Транскрипт:

Una semplice applicazione client/server 1 Il nostro obiettivo In questa parte del corso implementeremo un applicazione client/server che usa i socket Internet disponibili nei sistemi Unix/Linux. Nello specifico useremo i SOCK STREAM, che garantiscono una trasmissione dei pacchetti sequenziale e affidabile (grazie all uso del protocollo TCP). Il sistema sarà molto semplice: il server si metterà in ascolto su una porta locale, attendendo che i client comunichino con lui; ogni volta che un client lo contatterà gli invierà un messaggio e chiuderà la comunicazione ovviamente il server dovrà essere in grado di servire richieste multiple. il client contatterà il server e stamperà a video il messaggio ricevuto. Apposite stampe a video ci informeranno dello stato dei due processi e delle erazioni che stanno avvenendo. Nelle prossime sezioni andremo a vedere le strutture dati e le system call che il sistema operativo ci mette a disposizione. Attenzione: le dispense non discutono i prototipi delle funzioni, ma sono solo un vademecum. Strutture dati Un socket è un descrittore di file, ovvero un. Strutture dati più complicate sono invece necessarie per il set-up della comunicazione: addrinfo prepara le informazioni che serviranno per la definizione dei socket: struct addrinfo { ai_flags; ai_family; ai_socktype; ai_protocol; size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; 1 Dispense per il corso di Sistemi di Elaborazione Informazione I, Scuola Interfacoltà di Scienze Strategiche, Università di Torino Docente: Alessia Visconti, http://di.unito.it/~visconti Le seguenti dispense sono distribuite sotto la Creative Common license CC BY-NC-SA. È consentito distribuire, modificare, creare opere derivate dall originale a patto che che venga riconosciuta la paternità dell opera all autore, non siano utilizzate per scopi commerciali, e che alla nuova opera venga attribuite una licenza identica o compatibile con l originale. 1

Alcune strutture dati ignorano la versione di IP, come sockaddr storage: struct sockaddr_storage { sa_family_t ss_family; char ss_pad1[_ss_pad1size]; 64_t ss_align; char ss_pad2[_ss_pad2size]; e come sockaddr: struct sockaddr { unsigned short char sa_family; sa_data[14]; Tuttavia, di quest ultima esistono delle strutture dati specializzate per lavorare con IPv4: struct sockaddr_in { short sin_family; unsigned short sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; struct in_addr { u32_t s_addr; e con IPv6: struct sockaddr_in6 { u_16_t sin6_family; u_16_t sin6_port; u_32_t sin6_flowinfo; struct in6_addr sin6_addr; u_32_t sin6_scope_id; struct in6_addr { unsigned char s6_addr[16]; sockaddr è compatibile con entrambe, quindi: struct sockaddr *sa; struct sockaddr_in sa_ipv4 = (struct sockaddr_in *)sa; struct sockaddr_in6 sa_ipv6 = (struct sockaddr_in6 *)sa; sono assegnamenti validi. 2

System Calls Abbiamo chiuso la sezione precedente parlando si indirizzi IPv4 e IPv6. Ma come si converte un indirizzo codificato in una struttura sockaddr nella famigliare notazione puntata? Con questa funzione: #include <arpa/inet.h> const char *inet_ntop( af, const void *src, char *dst, socklen_t size); le lunghezze degli indirizzi IPv4 e IPv6 sono contenuti in due macro: INET ADDRSTRLEN e INET6 ADDRSTRLEN, rispettivamente (in <netinet/in.h>). Per esempio per convertire un indirizzo IPv4 contenuto in una struttura sockaddr in sa e stamparlo a video dovremmo eseguire il seguente codice: char ipv4[inet_addrstrlen]; inet_ntop(af_inet, &(sa.sin_addr), ipv4, INET_ADDRSTRLEN); prf("ipv4: %s\n", ipv4); Concentriamoci ora sulle sulle system call che ci permetteranno di implementare la nostra applicazione client/server tramite stream socket. Il primo passo che dobbiamo fare è la compilazione delle strutture dati che ci servirà per la connessione al socket, ovvero le struct addrinfo. Per farlo sarà necessario inserire solo alcune informazioni salienti e la system call getaddrinfo si occuperà di fare il lavoro. La system call freeaddrinfo() invece libererà la memoria quando la struttura non sarà più necessaria. #include <netdb.h> getaddrinfo(const char *node, const char *service, const struct addrinfo *hs, struct addrinfo **res); void freeaddrinfo(struct addrinfo *res); Per esempio se volessimo connetterci sulla porta 4242 del nostro host locale, tramite TCP. lasciando che sia il sistema a scegliere tra IPv4 e IPv6, quello che dovremmo scrivere sarà: struct addrinfo hs, *res; char *node = NULL; char *service = "4242"; memset(&hs, 0, sizeof hs); hs.ai_family = AF_UNSPEC; hs.ai_socktype = SOCK_STREAM; hs.ai_flags = AI_PASSIVE; status = getaddrinfo(node, service, &hs, &res); freeaddrinfo(res); 3

Dopo aver caricato le informazioni necessarie non ci resta che ottenere il descrittore associato al socket: socket( domain, type, protocol); dove i parametri necessari alla funzione sono già codificati nella struct addrinfo. Nel caso di un server devo anche associare il socket a una porta su cui il server stesso sarà in ascolto e cui accetterà le connessioni entranti, attività svolte dalle seguenti system call: bind( sockfd, struct sockaddr *my_addr, addrlen); listen( sockfd, backlog); accept( sockfd, struct sockaddr *addr, socklen_t *addrlen); Anche in questo caso tutte le informazioni sono già codificati nella struct addrinfo. Ma come comunicare su una porta associata ad un dato indirizzo? Con la seguente system call: connect( sockfd, struct sockaddr *serv_addr, addrlen); Ora che la comunicazione è stata stabilita servono due system call per inviare e ricevere messaggi: send( sockfd, const void *msg, len, flags); recv( sockfd, void *buf, len, flags); Attenzione: queste system call permettono la comunicazione solo su stream socket. L ultima system call che ci serve è quella che ci permette di chiudere la comunicazione: #include <unistd.h> close( fd); Ora abbiamo tutte le informazioni che ci servono per procedere con l implementazione! Letture consigliate Il materiale presentato in queste dispense segue (abbastanza) fedelmente il libro (in inglese) di Brian Beej Jorgenses Hall [B1]. Di questo manuale esiste anche una traduzione in italiano [B2], che però non è aggiornata. Ricordate sempre che il comando man è il modo migliore per avere informazioni puntuali sulle strutture dati e sulle system call utilizzate. 4

Bibliografia [B1] Brian Beej Jorgenses Hall, Beej s Guide to Netwroking Programming, Version 3.0.15, July 2012, http://beej.us/guide/bgnet/ [B2] Brian Beej Jorgenses Hall, Guida di Beej alla Programmazione di Rete, Version 2.4.5, Agosto 2007, http://linguaggioc.altervista.org/guidabeej_it.php 5