Introduzione alla programmazione C di socket

Похожие документы
Creare una applicazione Winsock di base

L uso di Socket UDP. TCP vs. UDP UDP

Reti (già Reti di Calcolatori )

Laboratorio di Programmazione in Rete

Interazione (TCP) Client-Server con le socket

Opzioni per le 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.

IPC Inter Process Communication

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

L interfaccia socket

Paradigma client-server

Una prima applicazione in C per l utilizzo delle socket

I Socket. Laboratorio Software M. Grotto R. Farina

Esercitazione [6] Client/Server con Socket

Lo strato di applicazione in Internet

COMUNICAZIONE TRA PROCESSI REMOTI IN UNIX

Una semplice applicazione client/server 1

Cenni di programmazione distribuita in C++ Mauro Piccolo

INTERNET DOMAIN SOCKETS (Cap.59)

Socket TCP. prima parte

Socket per TCP: Fondamenti

Elementi di programmazione con interfaccia Socket

Le Reti Informatiche

Introduzione alle applicazioni di rete

Esempio 1: stampa locale di file remoto

Guida all' uso dei sockets nella programmazione in C

Instradamento. Fondamenti di Informatica

MODELLI ISO/OSI e TCP/IP

unsigned long inet_addr(cp) char *cp;

MODELLI ISO/OSI e TCP/IP

Strato di trasporto. Livello di applicazione SAP. Livello di trasporto. Livello di rete SAP

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

TCP/IP: summary. Lorenzo Cavallaro, Andrea Lanzi

Applicazione distribuita

Il modello Client/Server. La comunicazione

Controllo Winsock di Visual Basic

Il livello di Trasporto del TCP/IP

Livello di trasporto: meccanismi trasferimento dati affidabile, TCP

Creare un'elementare backdoor in C in ambiente UNIX

Telematica di Base. IL Livello di Trasporto TCP

Livello trasporto. Servizi del livello trasporto

Configurazione delle interfacce di rete

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

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

TECNOLOGIE E PROGETTAZIONE DI SISTEMI INFORMATICI E DI TELECOMUNICAZIONI

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

Architettura e servizi Internet

Networking. Mauro Migliardi Ph. D.

Indirizzamento IP. Politecnico di Milano Facoltà di Ingegneria dell Informazione

Architetture di rete. 4. Le applicazioni di rete

Corso di Reti di Telecomunicazioni. Giovanni Schembra. Trasmissione trame su canale broadcast

Esercizio Trasferimento File e Multicast

Mariarosaria Napolitano. Architettura TCP/IP. Corso di: Laboratorio di tecnologie informatiche e telematiche

Транскрипт:

Introduzione alla programmazione C di socket (testo di riferimento : M. J. Donahoo, K. L. Calvert, TCP/IP Sockets in C: Practical Guide for Programmers. Morgan Kaufman Publishers. ) A.A. 2005/06 Una rete TCP/IP Organizzazione a livelli: relazione tra protocolli, applicazioni e API socket Socket API Implementazione dei protocolli (S.O.) Socket API TCP TCP IP HOST canale IP canale Es: ethernet Router IP HOST 1

Indirizzi La comunicazione tra programmi è possibile se si conosce l indirizzo dei programmi che devono comunicare Indirizzo Internet (usato da IP) identificatori a 32 bit notazione: 193.204.187.194 identifica una interfaccia 193.204.187.194 209.134.xxx.xxx www.di.uniba.it 193.204.1.. Numero di porta (interpretato da TCP o UDP) identificatori a 16 bit (sempre in relazione ad un IP) range: Well-Known: 0 1023 Registered: 1024 49151 Dynamic (private) 49152 65535 http://www.iana.org/assignments/port-numbers E-mail Aplicazione www 80 23 Porta 193.204.187.194 Una Socket: una visione di insieme Una socket è un dispositivo che consente la comunicazione (trasferimento di dati) tra due processi su internet, in una LAN, su un singolo computer Esistono varie famiglie di socket. Ogni famiglia riunisce i socket che utilizzano gli stessi protocolli (Protocol Family) sottostanti, supporta un sottoinsieme di stili di comunicazione e possiede un proprio formato di indirizzamento (Address Family) Alcuni esempi di famiglie Unix Domain sockets: file in una directory di un computer local host. Consentono il trasferimento di dati tra processi sulla stessa macchina Unix Internet socket (AF_INET): consentono il trasferimento di dati tra processi posti su macchine remote connesse tramite una LAN o Internet 2

Una Socket: una visione di insieme (cont.) Il tipo di una socket definisce una modalità di comunicazione che una socket usa per inviare dati: Streaming Socket (SOCK_STREAM): Fornisce una connessione sequenziale, affidabile e full-duplex. Il protocollo TCP è basato su questo tipo di socket. Datagram socket (SOCK_DGRAM): Supporta i datagrammi (privo di connessione, messaggi inaffidabili di una lunghezza massima prefissata). Il protocollo UDP è basato su questo tipo di socket Osserviamo che: AF_INET + SOCK_STREAM determineranno una connessione TCP, AF_INET + SOCK_DGRAM determineranno una trasmissione UDP Socket, Protocolli e Porte su un singolo host Una socket che usa la famiglia di protocolli TCP/IP è univocamente determinata da un indirizzo internet, un protocollo di comunicazione (TCP o UDP) e un numero di porta Applicazioni Socket TCP Applicazioni Socket UDP Porte TCP 1 2 65535 1 2 65535 TCP UDP Porte UDP IP Host Sockets bound to ports Descriptor reference 3

Una Socket: una visione di insieme (cont.) Nel gergo socket uno dei processi che comunicano è chiamato Server e l altro Client. Tra i due processi il server è quello che ha controllo maggiore, poiché è il processo che inizialmente crea la socket. Più client possono comunicare attraverso la stessa socket, ma solo un server può essere associato ad una definita socket. Il fatto che un programma agisca come client o come server determina un differente uso delle API Socket Il client ha bisogno di conoscere l indirizzo del server (ma non il viceversa) Il Server può apprendere informazioni sull indirizzo del client una volta stabilita la connessione Programmazione socket Lo sviluppatore ha il controllo di tutto ciò che sta sul lato del livello applicativo della socket, ma ha poco controllo sul lato a livello di trasporto (alcuni parametri) 1 2 65535 1 2 65535 TCP UDP Livello di Livello di trasporto IP Host 4

Programmazione socket (cont.) Il client deve contattare il server Il programma server deve essere in esecuzione come processo Il programma server deve avere una porta (socket) che dia il benvenuto al contatto iniziale stabilito da un processo client in esecuzione Durante l handshake a tre vie: il TCP server crea un nuova socket (dedicata a quel particolare client socket di connessione) Il client contatta il server tramite: la creazione di una socket locale la specifica di un indirizzo del processo server (IP, numero di porta relativi al processo) Dopo la creazione della socket nel client: TCP avvia un handshake a tre vie e stabilisce una connessione TCP con il server Interazione TCP Client/Server Server 1. (Inizializzare una WSA) 2. Creare una socket 3. Assegnare un local address alla socket 4. Settare la socket all ascolto 5. Iterativamente: a. Accettare una nuova connessione b. Inviare e ricevere dati c. Chiudere la connessione Client 1. (Inizializzare una WSA) 2. Creare una Socket 3. Connettersi al server 4. Inviare e ricevere dati 5. Chiudere la connessione 5

Una astrazione di una socket: Strutture dati associate ad una socket TCP Closed Descrittori Struttura di una socket L applicazione fa riferimento alla struttura di una socket tramite descrittori differenti processi possono fare riferimento alla stessa struttura socket informazioni associate alla struttura socket: code di ricezione e invio informazioni sullo stato dell handshake (per una socket TCP) indirizzi internet Il ciclo di vita di una socket TCP Notazione Eventi all interno dell applicazione che causano il cambiamento di stato di una struttura socket connect() blocca Indirizzi:A.B.C.D = client W.X.Y.Z server Closed = porta del server Connecting P A.B.C.D W.X.Y.Z Handshake completato Established P A.B.C.D W.X.Y.Z Eventi come l arrivo di messaggi, ecc.. 6

Interazione TCP Client/Server Server 1. (Inizializzare una WSA) 2. Creare una socket 3. Assegnare un local address alla socket 4. Settare la socket all ascolto 5. Iterativamente: a. Accettare una nuova connessione b. Inviare e ricevere dati c. Chiudere la connessione Client 1. (Inizializzare una WSA) 2. Creare una Socket 3. Connettersi al server 4. Inviare e ricevere dati 5. Chiudere la connessione Il ciclo di vita di una socket TCP Stabilire una connessione (lato client) client Closed Una socket creata fa riferimento ad un protocollo specifico ma non ha indirizzo IP e numero diporta 7

Il ciclo di vita di una socket TCP Stabilire una connessione (lato client) client Closed connect() con IP W.X.Y.Z e porta blocca Completa i campi; Invia richiesta di connes. al server Connecting P A.B.C.D W.X.Y.Z P non in uso da altre socket indirizzo dell interfaccia attraverso cui vengono inviati i pacchetti al server Il ciclo di vita di una socket TCP Stabilire una connessione (lato client) client Closed connect() con IP W.X.Y.Z e porta blocca Completa i campi; Invia richiesta di connes. al server Connecting P A.B.C.D W.X.Y.Z Handshake a tre vie una richiesta di connessione client server Un ack server client Un ack client server 8

Il ciclo di vita di una socket TCP Stabilire una connessione (lato client) client connect() con IP W.X.Y.Z e porta blocca Closed Completa i campi; Invia richiesta di connes. al server Connecting P A.B.C.D W.X.Y.Z Handshake a tre vie completato Established P A.B.C.D W.X.Y.Z client il client considera la Il ciclo connessione di stabilita vita non di una socket TCP appena riceve l ack dal server se il server non accetta una connessione invia un messaggio connect() con IP W.X.Y.Z e porta Stabilire una connessione (lato client) blocca Closed Completa i campi; Invia richiesta di connes. al server Connecting P A.B.C.D W.X.Y.Z Handshake a tre vie completato Established P A.B.C.D W.X.Y.Z 9

Il ciclo di vita di una socket TCP(cont.) Setup della socket (lato server) server Closed il server deve legare la socket ad una porta locale nota al client () Il ciclo di vita di una socket TCP(cont.) Setup della socket (lato server) server Closed bind() con porta returns Setta indirizzo locale e porta Closed INADDR_ANY nel caso in cui il server ha più di un IP, consente alla socket di ricevere connessioni indirizzate da tutti i suoi IP 10

Il ciclo di vita di una socket TCP(cont.) Setup della socket (lato server) server ualunque richiesta di connessione che avviene prima della listen() verrà rigettata bind() con porta listen() returns Return Closed Setta indirizzo locale e porta Closed INADDR_ANY Setta all ascolto Listening nuove conn. INADDR_ANY Il ciclo di vita di una socket TCP(cont.) Accettare la connessione (lato server) accept() Blocca sino alla connessione con un client Listening nuove conness. 11

Il ciclo di vita di una socket TCP(cont.) Gestione della richiesta di connessione in entrata Richiesta di connessione da A.B.C.D/P Listening nuove connessi. Processo trasparente Creare una nuova socket per la connessione, settare gli indirizzi e continuare l handshake Connecting W.X.Y.Z P A.B.C.D ack server client IP di destinazione IP e porta del mittente Il ciclo di vita di una socket TCP(cont.) Gestione della richiesta di connessione in entrata Richiesta di connessione da A.B.C.D/P Listening nuove connessi. Processo trasparente Creare una nuova socket per la connessione, settare gli indirizzi e continuare l handshake Connecting W.X.Y.Z P A.B.C.D il numero di porta locale è lo stesso per le due socket La socket originale non cambia stato 12

Il ciclo di vita di una socket TCP(cont.) Gestione della richiesta di connessione il server non in entrata Richiesta di connessione da A.B.C.D/P Listening nuove connessi. Processo trasparente Creare una nuova socket per la connessione, settare gli indirizzi e continuare l handshake Connecting W.X.Y.Z P A.B.C.D considera la connessione stabilita finchè non viene inviato il terzo messaggio Established Handshake completato W.X.Y.Z P A.B.C.D Il ciclo di vita di una socket TCP(cont.) Accettare la connessione (lato server) Listening nuove conness. accept() Blocca sino alla connessione con un client Evento descritto in Richiesta di connessione in entrata Established W.X.Y.Z P A.B.C.D Ritorna il descrittore per questa socket (socket di connessione) Rimuove la socket dalla lista di nuove conness. Listening Nuove connessi. 13

Il ciclo di vita di una socket TCP(cont.) Chiudere la connessione (indipendente dal lato) close() Returns immediately Established Ha inizio un P handshake di chiusura, Il descrittore A.B.C.D viene deallocato W.X.Y.Z un msg di chiusura viene inviato all altra parte (fine dati da trasferire) un ack per questo msg viene inviato Terminazione senza perdita di dati in transito Il ciclo di vita di una socket TCP(cont.) Chiudere la connessione (indipendente dal lato) close() Returns immediately Established Ha inizio un P handshake di chiusura, Il descrittore A.B.C.D viene deallocato W.X.Y.Z un msg di chiusura viene inviato all altra parte (fine dati da trasferire) un ack per questo msg viene ricevuto La connessione viene chiusa completamente solo quando un handshake simile avviene in direzione opposta Terminazione senza perdita di dati in transito 14

Il ciclo di vita di una socket TCP(cont.) Chiudere la connessione (indipendente dal lato) close() Returns immediately Established Ha inizio un Closed handshake di P chiusura, P Il descrittore A.B.C.D viene A.B.C.D deallocato W.X.Y.Z W.X.Y.Z Hs msg Half-Closed P A.B.C.D W.X.Y.Z Terminazione senza perdita di dati in transito Il ciclo di vita di una socket TCP(cont.) Chiudere la connessione (indipendente dal lato) close() Returns immediately Established Ha inizio un Closed handshake di P chiusura, P Il descrittore A.B.C.D viene A.B.C.D deallocato W.X.Y.Z W.X.Y.Z Hs msg Half-Closed P A.B.C.D W.X.Y.Z Hs ack Terminazione senza perdita di dati in transito Time-wait P A.B.C.D W.X.Y.Z 15

Funzione socket() Crea una socket dedicata ad un fornitore di servizi specifico SOCKET socket( int af, int type, int protocol ); Tipo SOCK_STREAM SOCK_DGRAM Address family (AF_INET: Internet Address Family) Significato Tipo di socket Fornisce una connessione sequenziale, affidabile e full-duplex. Il protocollo TCP è basato su questo tipo di socket. Supporta i datagrammi (privo di connessione, messaggi inaffidabili di una lunghezza massima prefissata). Il protocollo UDP è basato su questo tipo di socket. Protocollo da usare con la socket per l address family indicata (solitamente posto a 0 indica il protocollo derivato dalla coppia [af, type]) Funzione socket(): valori di ritorno Crea una socket dedicata ad un fornitore di servizi specifico SOCKET socket( int af, int type, int protocol ); La funzione restituisce un intero che è interpretato come un descrittore che referenzia la nuova socket in caso di successo. Altrimenti restituisce un codice di errore 16

Funzione socket(): valori di ritorno Crea una socket dedicata ad un fornitore di servizi specifico SOCKET socket( int af, int type, int protocol ); La funzione restituisce un intero che è interpretato come un descrittore che referenzia la nuova socket in caso di successo. Altrimenti restituisce un codice di errore ATTENZIONE!!! Una applicazione client usa indirizzo IP e porta per connettersi La funzione crea un socket senza nome Bind() Address Family Indirizzo IP Porta che identifica l applicazione Funzione bind() Associa un nome alla socket creata in precedenza int bind( SOCKET s, const struct sockaddr name, int namelen); Descrittore di un socket Indirizzo da assegnare alla socket Lunghezza in byte di name 17

Struttura sockaddr_in La struttura sockaddr è interpretata differentemente a seconda dei contesti determinati dalle differenti address family (AF_XXXX). Forma di sockaddr In AF_INET (con protocollo IPv4) struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; Un puntatore ad una sockaddr non è rigorosamente interpretato come tale Le funzioni Winsock che fanno uso di un puntatore ad una struttura di tipo sockaddr devono necessariamente effettuare una operazione di cast bind( m_socket, (SOCKADDR) &service, sizeof(service) Funzione bind(): valori di ritorno Associa un nome alla socket creata in precedenza int bind( SOCKET s, const struct sockaddr name, int namelen); La funzione restituisce O in caso di successo. Altrimenti restituisce un codice di errore Per il TCP/IP se la porta è specificata come zero, il fornitore di servizi assegna una porta tra 1024 e 5000 L applicazione può usare la funzione getsockname (dopo la bind) per apprendere l indirizzo IP e la porta assegnati 18

#include <stdio.h> #include "winsock2.h" un esempio di codice void main() { // Initialize Winsock WSADATA wsadata; int iresult = WSAStartup(MAKEWORD(2,2), &wsadata); if (iresult!= NO_ERROR) printf("error at WSAStartup()\n"); // Create a SOCKET for listening for incoming connection requests SOCKET ListenSocket; ListenSocket = socket(af_inet, SOCK_STREAM, IPPROTO_TCP); if (ListenSocket == INVALID_SOCKET) { printf("error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return; } // The sockaddr_in structure specifies the address family, IP address, and port for the socket that //is being bound. sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr("127.0.0.1"); service.sin_port = htons(27015); un esempio di codice (cont.) // Bind the socket. if (bind( ListenSocket, (SOCKADDR) &service, sizeof(service)) == SOCKET_ERROR) { printf("bind() failed.\n"); closesocket(listensocket); return; } WSACleanup(); return; } 19

Funzione listen() Setta la socket in uno stato in cui rimane in attesa di richiesta di connessioni int listen( SOCKET s, int backlog); Descrittore di un socket Massima lungezza della coda di connessioni entranti Funzione listen(): valori di ritorno Setta la socket in uno stato in cui rimane in attesa di richiesta di connessioni int listen( SOCKET s, int backlog); Descrittore di un socket Massima lungezza della coda di connessioni entranti La funzione restituisce O in caso di successo. Altrimenti restituisce un codice di errore 20

Funzione accept() Consente un tentativo di connessione in entrata su una socket SOCKET accept( SOCKET s, struct sockaddr addr, int addrlen); Descrittore di un socket Puntatore opzionale ad un buffer che riceve l indirizzo dell entità che fa richiesta di connessione Puntatore opzionale checontienela lunghezza di addr Funzione accept() Consente un tentativo di connessione in entrata su una socket SOCKET accept( SOCKET s, struct sockaddr addr, int addrlen); La funzione estrae la prima connessione dalla coda di pendenza delle connessioni sul socket s. Successivamente crea e restituisce un riferimento ad una nuova socket. uesta nuova socket è quella che abbiamo chiamato socket di connessione. Mantiene le stesse prorpieta della socket s 21

Funzione connect() Stabilisce una connessione ad una socket specificata int connect( SOCKET s, const struct sockaddr name, int namelen); Descrittore di un socket non connesso Nome della socket con cui dovrebbe essere stabilita la connessione lunghezza di name Funzione connect() Stabilisce una connessione ad una socket specificata int connect( SOCKET s, const struct sockaddr name, int namelen); Per una socket di tipo connectionless (per esempio SOCK_DGRAM), la connect() semplicemente stabilisce un indirizzo di destinazione di default ualunque datagram ricevuto da un indirizzo diverso da quello di destinazione verrà scaricato Se il campo indirizzo della struttura che specifica il name è zero, la socket verrà disconnessa 22

#include <stdio.h> #include "winsock2.h" void main() { un esempio di codice // Initialize Winsock WSADATA wsadata; int iresult = WSAStartup(MAKEWORD(2,2), &wsadata); if (iresult!= NO_ERROR) printf("error at WSAStartup()\n"); // Create a SOCKET for connecting to server SOCKET ConnectSocket; ConnectSocket = socket(af_inet, SOCK_STREAM, IPPROTO_TCP); if (ConnectSocket == INVALID_SOCKET) { printf("error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return; } un esempio di codice (cont.) // The sockaddr_in structure specifies the address family, // IP address, and port of the server to be connected to. sockaddr_in clientservice; clientservice.sin_family = AF_INET; clientservice.sin_addr.s_addr = inet_addr( "127.0.0.1" ); clientservice.sin_port = htons( 27015 ); // Connect to server. if ( connect( ConnectSocket, (SOCKADDR) &clientservice, sizeof(clientservice) ) == SOCKET_ERROR) { printf( "Failed to connect.\n" ); WSACleanup(); return; } printf("connected to server.\n"); WSACleanup(); return; } 23

Funzione send() Invia dati ad una socket connessa int send( SOCKET s, const char buf, int len, int flags ); Descrittore di una socket connessa Puntatore al Buffer contenente I dati da trasmettere Indicatore che specifica il modo in cui la chiamata è fatta Lunghezza dei dati in buf, in byte Il flag può essere usato per influenzare il comportamento della funzione Funzione send(): valori di ritorno Invia dati ad una socket connessa int send( SOCKET s, const char buf, int len, int flags ); Descrittore di una socket connessa Buffer contenente I dati da trasmettere Indicatore che specifica il modo in cui la chiamata è fatta Lunghezza dei dati in buf, in byte Il flag può essere usato per influenzare il comportamento della funzione La funzione restituisce il numero di byte trasmessi in caso di successo. Un codice di errore, altrimenti 24

Funzione recev() Riceve dati da una socket connessa (o legata ) int recev(socket s, char buf, int len, int flags ); Descrittore di una socket connessa Puntatore al Buffer contenente I dati da ricevere Indicatore che specifica il modo in cui la chiamata è fatta Lunghezza dei dati in buf, in byte Il flag può essere usato per influenzare il comportamento della funzione Interazione UDP Client/Server Server 1. (Inizializzare una WSA) 2. Creare una socket 3. Assegnare un local address alla socket 4. Iterativamente: a. Inviare e ricevere dati b. Chiudere la connessione Client 1. (Inizializzare una WSA) 2. Creare una Socket 3. Inviare e ricevere dati 4. Chiudere la connessione 25

Funzione recevfrom() Riceve un datagram e memorizza l indirizzo da cui i dati sono stati inviati int recvfrom( SOCKET s, char buf, int len, int flags, struct sockaddr from, int fromlen); Descrittore di una socket (eventualmente) connessa Lunghezza dei dati in buf, in byte Puntatore opzionale ad una struttura che contiene l indirizzo della socket target Buffer contenente I dati in ingresso Indicatore che specifica il modo in cui la chiamata è fatta Lunghezza dei dati in from, in byte Il flag può essere usato per influenzare il comportamento della funzione La funzione è normalmente usata per socket non orientate alla connessione. L indirizzo locale della socket deve essere noto Per applicazioni Server, questo è fatto esplicitamente con la funzione bind() Il binding esplicito è scoraggiato per applicazioni client (in tal caso la funxzione effettua un binding implicito #include <stdio.h> #include "winsock2.h" void main() { WSADATA wsadata; SOCKET RecvSocket; sockaddr_in RecvAddr; int Port = 27015; char RecvBuf[1024]; int BufLen = 1024; un esempio di codice sockaddr_in SenderAddr; int SenderAddrSize = sizeof(senderaddr); //----------------------------------------------- // Initialize Winsock WSAStartup(MAKEWORD(2,2), &wsadata); //----------------------------------------------- // Create a receiver socket to receive datagrams RecvSocket = socket(af_inet, SOCK_DGRAM, 0); //----------------------------------------------- 26

un esempio di codice (cont.) // Bind the socket to any address and the specified port. RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(port); RecvAddr.sin_addr.s_addr = htonl(inaddr_any); bind(recvsocket, (SOCKADDR ) &RecvAddr, sizeof(recvaddr)); //----------------------------------------------- // Call the recvfrom function to receive datagrams // on the bound socket. printf("receiving datagrams...\n"); recvfrom(recvsocket,recvbuf,buflen,0, (SOCKADDR)&SenderAddr, &SenderAddrSize); //----------------------------------------------- // Close the socket when finished receiving datagrams printf("finished receiving. Closing socket.\n"); closesocket(recvsocket); //----------------------------------------------- // Clean up and exit. printf("exiting.\n"); WSACleanup(); return; } Funzione sendto() Invia dati ad una specifica destinazione int sendto( SOCKET s, const char buf, int len, int flags, const struct sockaddr to, int tolen); Descrittore di una socket (eventualmente) connessa Buffer contenente I dati da trasmettere Lunghezza dei dati in buf, in byte Puntatore opzionale ad una struttura che contiene l indirizzo della socket target Indicatore che specifica il modo in cui la chiamata è fatta Lunghezza dei dati in to, in byte Il flag può essere usato per influenzare il comportamento della funzione La funzione è normalmente usata per socket non orientate alla connessione per inviare datagram ad una specifica socket identificata dai parametri. I parametri to e tolen vengono ignorati in caso di socket orientate alla connessione e la funzione diventa equivalente ad una send() 27

Funzione sendto():valori di ritorno Invia dati ad una specifica destinazione int sendto( SOCKET s, const char buf, int len, int flags, const struct sockaddr to, int tolen); Descrittore di una socket (eventualmente) connessa Buffer contenente I dati da trasmettere Lunghezza dei dati in buf, in byte Puntatore opzionale ad una struttura che contiene l indirizzo della socket target Indicatore che specifica il modo in cui la chiamata è fatta Lunghezza dei dati in to, in byte La funzione restituisce il numero di byte trasmessi in caso di successo. Un codice di errore, altrimenti #include <stdio.h> #include "winsock2.h" void main() { un esempio di codice WSADATA wsadata; SOCKET SendSocket; sockaddr_in RecvAddr; int Port = 27015; char SendBuf[1024]; int BufLen = 1024; //--------------------------------------------- // Initialize Winsock WSAStartup(MAKEWORD(2,2), &wsadata); //--------------------------------------------- // Create a socket for sending data SendSocket = socket(af_inet, SOCK_DGRAM, IPPROTO_UDP); 28

un esempio di codice (cont.) //--------------------------------------------- // Set up the RecvAddr structure with the IP address of // the receiver (in this example case "123.456.789.1") // and the specified port number. RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(port); RecvAddr.sin_addr.s_addr = inet_addr("123.456.789.1"); //--------------------------------------------- // Send a datagram to the receiver printf("sending a datagram to the receiver...\n"); sendto(sendsocket,sendbuf,buflen,0,(sockaddr ) &RecvAddr, sizeof(recvaddr)); //--------------------------------------------- // When the application is finished sending, close the socket. printf("finished sending. Closing socket.\n"); closesocket(sendsocket); //--------------------------------------------- // Clean up and quit. printf("exiting.\n"); WSACleanup(); return; } Cambiare una applicazione winsock in una socket Unix windows #include <stdio.h> #include <stdlib.h> #include <winsock.h> File header Include tutti tutte le definizioni e i prototipi Per socket(), connect(), send(), recev() Per sockaddrin unix #include <stdio.h> #include <stdlib.h> #include < sys/socket.h > #include <arpa/inet.h> 29

Setup dell applicazione Il codice è identico a meno del codice per inizializzare l applicazione windows WSADATA wsadata; Int iresult = WSAStartup(MAKEWORD(2,2), &wsadata); If (iresult!= NO_ERROR) printf( error at WSASturtup\n ); Codice di inizializzazione della libreria winsock comunicazione Il codice è identico Chiusura dell applicazione windows Closesocket(m_socket); WSAcleanup(); Exit(0) De-allocazione delle risorse usate da winsock unix Close(m_socket); Exit(0) 30

Gestione dell errore windows #include<stdio.h> #include<stdlib.h> #include<winsock.h> void ErrorManagement(char errormessage) { printf( "Error at socket(): %ld\n", WSAGetLastError() ); WSACleanup(); exit(1); } unix #include<stdio.h> #include<stdlib.h> void ErrorManagement(char errormessage) { perror(errormessage); exit(1); } 31