una rete tcp/ipdisys/socket.pdfuna socket che usa la famiglia di protocolli tcp/ip è univocamente...

31
1 Dott.ssa Valeria Carofiglio 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 Dott.ssa Valeria Carofiglio Una rete TCP/IP Applicazione TCP IP Socket API HOST canale IP canale Applicazione TCP IP Socket API HOST Es: ethernet Router Organizzazione a livelli: relazione tra protocolli, applicazioni e API socket Implementazione dei protocolli (S.O.)

Upload: others

Post on 19-Feb-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

  • 1

    Dott.ssa Valeria Carofiglio

    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

    Dott.ssa Valeria Carofiglio

    Una rete TCP/IP

    Applicazione

    TCP

    IP

    Socket API

    HOST

    canale IP canale

    Applicazione

    TCP

    IP

    Socket API

    HOSTEs: ethernet Router

    Organizzazione a livelli: relazione tra protocolli, applicazioni e API socket

    Implementazione dei protocolli

    (S.O.)

  • 2

    Dott.ssa Valeria Carofiglio

    Indirizzo Internet (usato da IP)

    • identificatori a 32 bit

    • notazione: 193.204.187.194

    • identifica una interfaccia

    • www.di.uniba.it 193.204.1..

    IndirizziLa comunicazione tra programmi è possibile se si conosce l’indirizzo dei

    programmi che devono comunicare

    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-numbers193.204.187.194209.134.xxx.xxx

    193.204.187.194

    Porta

    Aplicazione wwwE-mail

    80 23

    Dott.ssa Valeria Carofiglio

    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 (AddressFamily)

    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

  • 3

    Dott.ssa Valeria Carofiglio

    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

    AF_INET + SOCK_STREAM determineranno una connessione TCP, AF_INET + SOCK_DGRAM determineranno una trasmissione UDP

    Osserviamo che:

    Dott.ssa Valeria Carofiglio

    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

    TCP

    IP

    UDP

    …1 2 65535 … 1 2 65535 ……

    …Applicazioni

    Socket TCP

    Porte TCP

    Socket UDP

    Porte UDP

    Applicazioni

    HostDescriptor referenceSockets bound to ports

  • 4

    Dott.ssa Valeria Carofiglio

    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

    Dott.ssa Valeria Carofiglio

    Programmazione socketLo 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)

    TCP

    IP

    UDP

    …1 2 65535 … 1 2 65535 ……

    …Livello di trasporto

    Livello di Applicazione

    Host

  • 5

    Dott.ssa Valeria Carofiglio

    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

    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

    • Durante l’handshake a tre vie: il TCP server crea un nuova socket (dedicata a quel particolare client – socket di connessione)

    Dott.ssa Valeria Carofiglio

    Interazione TCP Client/Server

    Client1. (Inizializzare una WSA)2. Creare una Socket3. Connettersi al server4. Inviare e ricevere dati5. Chiudere la connessione

    Server1. (Inizializzare una WSA)2. Creare una socket 3. Assegnare un local address alla

    socket4. Settare la socket all’ascolto5. Iterativamente:

    a. Accettare una nuovaconnessione

    b. Inviare e ricevere datic. Chiudere la connessione

  • 6

    Dott.ssa Valeria Carofiglio

    Una astrazione di una socket:Strutture dati associate ad una socket TCP

    Descrittori

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    App

    licaz

    ione

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    • 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

    Struttura di una socket

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCPNotazione

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    App

    licaz

    ione

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    Handshake

    completato

    Connecting

    PA.B.C.D

    QW.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Established

    PA.B.C.D

    QW.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    connect()

    blocca

    Eventi all’interno dell’applicazione che causano il cambiamento di stato di una struttura socket

    Eventi come l’arrivo di messaggi, ecc..

    Indirizzi:A.B.C.D = client W.X.Y.Z server

    Q= porta del server

  • 7

    Dott.ssa Valeria Carofiglio

    Interazione TCP Client/Server

    Client1. (Inizializzare una WSA)2. Creare una Socket3. Connettersi al server4. Inviare e ricevere dati5. Chiudere la connessione

    Server1. (Inizializzare una WSA)2. Creare una socket 3. Assegnare un local address alla

    socket4. Settare la socket all’ascolto5. Iterativamente:

    a. Accettare una nuovaconnessione

    b. Inviare e ricevere datic. Chiudere la connessione

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCPStabilire una connessione (lato client)

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    App

    licaz

    ione

    cl

    ient Una socket creata

    fa riferimento ad un protocollo

    specifico ma non ha indirizzo IP e numero diporta

  • 8

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCPStabilire una connessione (lato client)

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    connect() con IP W.X.Y.Z e porta Qblocca

    App

    licaz

    ione

    cl

    ient

    Completa i campi;

    Invia richiesta di connes. al server

    Connecting

    PA.B.C.D

    QW.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    P non in uso da altre socket

    indirizzo dell’interfaccia attraverso cui vengono

    inviati i pacchetti al server

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCPStabilire una connessione (lato client)

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    connect() con IP W.X.Y.Z e porta Qblocca

    App

    licaz

    ione

    cl

    ient

    Completa i campi;

    Invia richiesta di connes. al server

    Connecting

    PA.B.C.D

    QW.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Handshakea tre vie

    • una richiesta di connessione client server• Un ack server client• Un ack client server

  • 9

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCPStabilire una connessione (lato client)

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    connect() con IP W.X.Y.Z e porta Qblocca

    App

    licaz

    ione

    cl

    ient

    Completa i campi;

    Invia richiesta di connes. al server

    Connecting

    PA.B.C.D

    QW.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Handshakea tre vie

    completato

    Established

    PA.B.C.D

    QW.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCPStabilire una connessione (lato client)

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    connect() con IP W.X.Y.Z e porta Qblocca

    App

    licaz

    ione

    cl

    ient

    Completa i campi;

    Invia richiesta di connes. al server

    Connecting

    PA.B.C.D

    QW.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Handshakea tre vie

    completato

    Established

    PA.B.C.D

    QW.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    • il client considera la connessione stabilita non appena riceve l’ack dal server• se il server non accetta una connessione invia un messaggio

  • 10

    Dott.ssa Valeria Carofiglio

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    App

    licaz

    ione

    se

    rver

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    Il ciclo di vita di una socket TCP(cont.)Setup della socket (lato server)

    il server deve legare la socket ad una porta locale nota al client

    (Q)

    Dott.ssa Valeria Carofiglio

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    App

    licaz

    ione

    se

    rver

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    Closed

    QINADDR_ANY

    **

    Local port

    Local IP

    Remote port

    Remote IP

    bind() con porta Qreturns

    Il ciclo di vita di una socket TCP(cont.)Setup della socket (lato server)

    Setta indirizzo locale e porta

    nel caso in cui il server ha più di un IP, consente alla socket di ricevere

    connessioni indirizzate da tutti i suoi IP

  • 11

    Dott.ssa Valeria Carofiglio

    Closed

    Local port

    Local IP

    Remote port

    Remote IP

    App

    licaz

    ione

    se

    rver

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    Closed

    QINADDR_ANY

    **

    Local port

    Local IP

    Remote port

    Remote IP

    bind() con porta Qreturns

    Il ciclo di vita di una socket TCP(cont.)Setup della socket (lato server)

    Setta indirizzo locale e porta

    Setta all’ascolto

    Listeningnuove conn.

    QINADDR_ANY

    **

    Local port

    Local IP

    Remote port

    Remote IP

    listen()

    Return

    Qualunque richiesta di connessione che avviene prima della listen() verrà rigettata

    Dott.ssa Valeria Carofiglio

    App

    licaz

    ione

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    accept()

    Blocca sino alla connessione con un client

    Il ciclo di vita di una socket TCP(cont.)Accettare la connessione (lato server)

    Listeningnuove conness.

    Q*

    **

    Local port

    Local IP

    Remote port

    Remote IP

  • 12

    Dott.ssa Valeria Carofiglio

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    Richiesta di connes-sione da A.B.C.D/P

    Il ciclo di vita di una socket TCP(cont.)Gestione della richiesta di connessione in entrata

    Processo trasparente

    Listeningnuove connessi.

    Q*

    **

    Local port

    Local IP

    Remote port

    Remote IPConnecting

    QW.X.Y.Z

    PA.B.C.D

    Local port

    Local IP

    Remote port

    Remote IP

    Creare una nuova socket per la connessione,

    settare gli indirizzi e continuare l’handshake

    IP di destinazione

    IP e porta del mittente

    ack server client

    Dott.ssa Valeria Carofiglio

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    Richiesta di connes-sione da A.B.C.D/P

    Il ciclo di vita di una socket TCP(cont.)Gestione della richiesta di connessione in entrata

    Processo trasparente

    Listeningnuove connessi.

    Q*

    **

    Local port

    Local IP

    Remote port

    Remote IPConnecting

    QW.X.Y.Z

    PA.B.C.D

    Local port

    Local IP

    Remote port

    Remote IP

    • il numero di porta locale è lo stesso per le due socket•La socket originale non cambia stato

    Creare una nuova socket per la connessione,

    settare gli indirizzi e continuare l’handshake

  • 13

    Dott.ssa Valeria Carofiglio

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    Richiesta di connes-sione da A.B.C.D/P

    Il ciclo di vita di una socket TCP(cont.)Gestione della richiesta di connessione in entrata

    Processo trasparente

    Listeningnuove connessi.

    Q*

    **

    Local port

    Local IP

    Remote port

    Remote IPConnecting

    QW.X.Y.Z

    PA.B.C.D

    Local port

    Local IP

    Remote port

    Remote IP

    Handshakecompletato

    Established

    QW.X.Y.Z

    PA.B.C.D

    Local port

    Local IP

    Remote port

    Remote IP

    Creare una nuova socket per la connessione,

    settare gli indirizzi e continuare l’handshake

    • il server non considera la connessione stabilita finchè non viene inviato il terzo messaggio

    Dott.ssa Valeria Carofiglio

    App

    licaz

    ione

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    accept()

    Blocca sino alla connessione con un client

    Il ciclo di vita di una socket TCP(cont.)Accettare la connessione (lato server)

    Evento descritto in Richiesta di connes-sione in entrataListening

    nuove conness.

    Q*

    **

    Local port

    Local IP

    Remote port

    Remote IP

    Established

    QW.X.Y.Z

    PA.B.C.D

    Local port

    Local IP

    Remote port

    Remote IP

    Ritorna il descrittore per questa socket (socket di connessione)

    ListeningNuove connessi.

    Q*

    **

    Local port

    Local IP

    Remote port

    Remote IP

    Rimuove la socket dalla lista di nuove conness.

  • 14

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCP(cont.)Chiudere la connessione (indipendente dal lato)

    App

    licaz

    ione

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    close()

    Returns immediately

    Terminazione senza perdita di dati in transito

    • un msg di chiusura viene inviato all’altra parte (fine dati da trasferire)• un ack per questo msg viene inviato

    Ha inizio un handshake di chiusura,

    Il descrittore viene deallocato

    Established

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCP(cont.)Chiudere la connessione (indipendente dal lato)

    App

    licaz

    ione

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    close()

    Returns immediately

    Terminazione senza perdita di dati in transito

    • 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 handshakesimile avviene in direzione opposta

    Ha inizio un handshake di chiusura,

    Il descrittore viene deallocato

    Established

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

  • 15

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCP(cont.)Chiudere la connessione (indipendente dal lato)

    Established

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    App

    licaz

    ione

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    close()

    Returns immediately

    Ha inizio un handshake di chiusura,

    Il descrittore viene deallocato

    Terminazione senza perdita di dati in transito

    Closed

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Half-Closed

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Hsmsg

    Dott.ssa Valeria Carofiglio

    Il ciclo di vita di una socket TCP(cont.)Chiudere la connessione (indipendente dal lato)

    Established

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    App

    licaz

    ione

    Impl

    emen

    tazi

    one

    della

    soc

    ket

    close()

    Returns immediately

    Ha inizio un handshake di chiusura,

    Il descrittore viene deallocato

    Terminazione senza perdita di dati in transito

    Closed

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Half-Closed

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Hsmsg Time-wait

    P

    A.B.C.D

    Q

    W.X.Y.Z

    Local port

    Local IP

    Remote port

    Remote IP

    Hsack

  • 16

    Dott.ssa Valeria Carofiglio

    Funzione socket()Crea una socket dedicata ad un fornitore di servizi specifico

    SOCKET socket( int af, int type, int protocol );

    Address family(AF_INET: Internet Address Family)

    Tipo di socket Protocollo da usare con la socket per l’address family indicata(solitamente posto a 0indica il protocollo derivato dalla coppia [af, type])

    Supporta i datagrammi (privo di connessione, messaggi inaffidabili di una lunghezza massima prefissata). Il protocollo UDP è basato su questo tipo di socket.

    SOCK_DGRAM

    Fornisce una connessione sequenziale, affidabile e full-duplex. Il protocollo TCP è basato su questo tipo di socket.

    SOCK_STREAM

    SignificatoTipo

    Dott.ssa Valeria Carofiglio

    Funzione socket(): valori di ritornoCrea 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

  • 17

    Dott.ssa Valeria Carofiglio

    Funzione socket(): valori di ritornoCrea una socket dedicata ad un fornitore di servizi specifico

    SOCKET socket( int af, int type, int protocol );

    ATTENZIONE!!!

    La funzione crea un socket senza nome

    Bind()

    • Address Family

    • Indirizzo IP

    • Porta che identifical’applicazione

    Una applicazione client usa indirizzo IP e porta per connettersi

    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

    Dott.ssa Valeria Carofiglio

    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

  • 18

    Dott.ssa Valeria Carofiglio

    Struttura sockaddr_in

    Forma di sockaddr In AF_INET (con protocollo IPv4)

    La struttura sockaddrè interpretata differentemente a seconda dei contesti determinati dalle

    differenti address family (AF_XXXX).

    bind( m_socket, (SOCKADDR*) &service, sizeof(service)

    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”

    Dott.ssa Valeria Carofiglio

    Funzione bind(): valori di ritornoAssocia 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 serviziassegna 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

  • 19

    Dott.ssa Valeria Carofiglio

    …un esempio di codice#include #include "winsock2.h"

    void main() {// Initialize WinsockWSADATA 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 requestsSOCKET 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);

    Dott.ssa Valeria Carofiglio

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

    }

  • 20

    Dott.ssa Valeria Carofiglio

    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 dellacoda di connessionientranti

    Dott.ssa Valeria Carofiglio

    Funzione listen(): valori di ritornoSetta 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 dellacoda di connessionientranti

    La funzione restituisce ‘O’ in caso di successo. Altrimenti restituisce un codice di errore

  • 21

    Dott.ssa Valeria Carofiglio

    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 ricevel’indirizzo dell’entitàche fa richiesta di

    connessione

    Puntatore opzionaleche contiene la

    lunghezza di addr

    Dott.ssa Valeria Carofiglio

    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 delleconnessioni sul socket s.

    Successivamente crea e restituisce un riferimento ad una nuovasocket.

    Questa nuova socket è quella che abbiamo chiamato socket di connessione.

    Mantiene le stesse prorpieta della socket s

  • 22

    Dott.ssa Valeria Carofiglio

    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

    Dott.ssa Valeria Carofiglio

    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

    Qualunque 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

  • 23

    Dott.ssa Valeria Carofiglio

    …un esempio di codice#include #include "winsock2.h"void main() {

    // Initialize WinsockWSADATA wsaData;int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);if (iResult != NO_ERROR)

    printf("Error at WSAStartup()\n");

    // Create a SOCKET for connecting to serverSOCKET ConnectSocket;ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (ConnectSocket == INVALID_SOCKET) {

    printf("Error at socket(): %ld\n", WSAGetLastError());WSACleanup();return;

    }

    Dott.ssa Valeria Carofiglio

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

    }

  • 24

    Dott.ssa Valeria Carofiglio

    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 chespecifica il modo in cui

    la chiamata è fatta

    Lunghezza deidati in buf, in

    byteIl flag può essere usato per influenzare il comportamento della funzione

    Dott.ssa Valeria Carofiglio

    Funzione send(): valori di ritornoInvia 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 chespecifica il modo in cui

    la chiamata è fatta

    Lunghezza deidati in buf, in

    byteIl 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

  • 25

    Dott.ssa Valeria Carofiglio

    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 chespecifica il modo in cui

    la chiamata è fatta

    Lunghezza deidati in buf, in

    byteIl flag può essere usato per influenzare il comportamento della funzione

    Dott.ssa Valeria Carofiglio

    Interazione UDP Client/Server

    Client1. (Inizializzare una WSA)2. Creare una Socket3. Inviare e ricevere dati4. Chiudere la connessione

    Server1. (Inizializzare una WSA)2. Creare una socket 3. Assegnare un local address alla

    socket4. Iterativamente:

    a. Inviare e ricevere datib. Chiudere la connessione

  • 26

    Dott.ssa Valeria Carofiglio

    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

    Buffer contenente I dati in ingresso

    Indicatore che specifica ilmodo in cui la chiamata è

    fatta

    Lunghezza deidati in buf, in

    byte

    Il flag può essere usato per influenzare il comportamento della funzione

    Puntatore opzionalead una struttura checontiene l’indirizzodella socket target

    Lunghezza deidati in from, in

    byte

    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

    Dott.ssa Valeria Carofiglio

    …un esempio di codice#include #include "winsock2.h"

    void main() {WSADATA wsaData;SOCKET RecvSocket;sockaddr_in RecvAddr;

    int Port = 27015;char RecvBuf[1024];int BufLen = 1024;

    sockaddr_in SenderAddr;int SenderAddrSize = sizeof(SenderAddr);//-----------------------------------------------// Initialize WinsockWSAStartup(MAKEWORD(2,2), &wsaData);//-----------------------------------------------// Create a receiver socket to receive datagramsRecvSocket = socket(AF_INET, SOCK_DGRAM, 0);//-----------------------------------------------

  • 27

    Dott.ssa Valeria Carofiglio

    …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 datagramsprintf("Finished receiving. Closing socket.\n");closesocket(RecvSocket);//-----------------------------------------------// Clean up and exit.printf("Exiting.\n");WSACleanup();return;

    }

    Dott.ssa Valeria Carofiglio

    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 datrasmettere

    Indicatore che specifica ilmodo in cui la chiamata è

    fatta

    Lunghezza deidati in buf, in

    byte

    Il flag può essere usato per influenzare il comportamento della funzione

    Puntatore opzionalead una struttura checontiene l’indirizzodella socket target

    Lunghezza deidati in to, in

    byte

    La funzione è normalmente usata per socket non orientate alla connessione per inviare datagram ad una specifica socket identificata dai parametri. I parametrito e tolen vengono ignorati in caso di socket orientate alla connessione e la

    funzione diventa equivalente ad una send()

  • 28

    Dott.ssa Valeria Carofiglio

    Funzione sendto():valori di ritornoInvia 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 datrasmettere

    Indicatore che specifica ilmodo in cui la chiamata è

    fatta

    Lunghezza deidati in buf, in

    bytePuntatore opzionalead una struttura checontiene l’indirizzodella socket target

    Lunghezza deidati in to, in

    byte

    La funzione restituisce il numero di byte trasmessi in caso di successo.

    Un codice di errore, altrimenti

    Dott.ssa Valeria Carofiglio

    …un esempio di codice#include #include "winsock2.h"void main() {

    WSADATA wsaData;SOCKET SendSocket;sockaddr_in RecvAddr;int Port = 27015;char SendBuf[1024];int BufLen = 1024;//---------------------------------------------// Initialize WinsockWSAStartup(MAKEWORD(2,2), &wsaData);//---------------------------------------------// Create a socket for sending dataSendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

  • 29

    Dott.ssa Valeria Carofiglio

    …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 receiverprintf("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;

    }

    Dott.ssa Valeria Carofiglio

    File header

    #include #include

    #include < sys/socket.h >

    #include

    Include tutti tutte le definizioni e i prototipi

    #include #include

    #include

    Per socket(), connect(), send(), recev()

    Per sockaddrin

    windows

    unix

    Cambiare una applicazione winsock in una socket Unix

  • 30

    Dott.ssa Valeria Carofiglio

    Setup dell’applicazione

    Codice di inizializzazionedella libreria

    winsock

    WSADATA wsaData;Int iResult = WSAStartup(MAKEWORD(2 ,2), &wsaData);If (iResult != NO_ERROR)

    printf(“error at WSASturtup\n”);

    windows

    Il codice è identico a meno del codice per inizializzarel’applicazione

    comunicazione

    Il codice è’ identico

    Dott.ssa Valeria Carofiglio

    Chiusura dell’applicazione

    Close(m_socket);

    Exit(0)

    De-allocazione dellerisorse usate da winsock

    Closesocket(m_socket);WSAcleanup();

    Exit(0)

    windows

    unix

  • 31

    Dott.ssa Valeria Carofiglio

    Gestione dell’errore

    #include#include

    void ErrorManagement(char* errorMessage) {perror(errorMessage);exit(1);

    }

    #include#include#include

    void ErrorManagement(char* errorMessage) {printf( "Error at socket(): %ld\n", WSAGetLastError() );WSACleanup();exit(1);

    }

    windows

    unix