Il modello cliente/servente e l’interfaccia Socket per l’implementazione di applicazioni Prof. Alfio Lombardo IL PROBLEMA DEL RENDEZ-VOUS Processo Processo A A Messaggio Messaggio Processo B B Processo IL PROBLEMA DEL RENDEZ-VOUS Processo Processo A A Messaggio Messaggio Processo B B Processo MODELLO CLIENTE - SERVENTE CLIENTE CLIENTE Richiesta Risposta SERVENTE La gestione della concorrenza nel server Remote Cliente Login INTERNET Cliente Cliente Server CLIENTE 2 Connessione 2 CLIENTE CLIENTE 1 1 SERVENTE SERVENTE MASTER Connessione 1 Richiesta Risposta SERVENTE SLAVE 1 LA GESTIONE DEI CRASH NEL SERVER I Scenario: Ack CLIENTE Richiesta Risposta Write SERVENTE I Scenario: Ack Write No Transaction CLIENTE Richiesta Risposta SERVENTE II Scenario Write CLIENTE Richiesta Risposta Ack SERVENTE II Scenario Write Ack Duplicate Transaction CLIENTE ? Richiesta Richiesta Risposta SERVENTE Ripristino dei guasti nel Server Strategia del Cliente Ritrasmetti in S1 Strategia del Servente Write Ack Write Ack AF(W) AWF F(AW) F(WA) WAF WF(A) NO OK OK OK OK DUP Ritrasmetti in S0 OK DUP NO Ritrasmetti OK DUP OK Non Ritrasmetti NO OK NO S1 = stato di attesa della conferma NO OK NO DUP OK DUP DUP OK OK POLITICHE DI GESTIONE DEI GUASTI NEL SERVER At most once At least once L’interfaccia socket AP1 AP2 AP3 Funzioni di sistema Kernel del Sistema Operativo contenente il software TCP/UDP Il concetto di Socket Definizione: Generalizzazione del meccanismo di accesso ai file in Unix che fornisce un punto di accesso per la comunicazione Appl. process Il “canale” di comunicazione tra due Applicativi è rappresentato da: Client port Addr, IP Client Addr, IP Server Addr, Server port Addr Un socket identifica localmente il canale tra due Applicativi Appl. process Modalita’ c.o.: Servente Socket( ) socket = socket(family, type, protocol) Bind( ) family ::= bind (socket,localaddr,addrlen) type::= {PF_INET, {SOCK_STREAM, PF_APPLETALK, SOCK_DGRAM, listen(socket,qlength) Listen( ) PF_PUP, ...} …..} Accept( ) accept(socket,addr,addrlen) newsocket Fork()) fork( master close(socket) Close( ) slave recv(sock,*buf,length,flags) Recv( ) Send( ) send(sock,*buf, length,flags) Modalita’ c.o.: Cliente Socket( ) ) intConnect( connect(socket,destaddr,addrlength ) Send( ) Recv( ) Servente Cliente Socket( ) Bind( ) Socket( ) Listen( ) Connect( ) Accept( ) Fork( ) master Close( ) slave Send( ) Recv( ) Recv( ) Send( ) Modalita’ c.l. Servente Cliente Socket( ) Socket( ) Bind( ) Bind( ) int recvfrom(sock,*buf, length, RecvFrom( ) RecvFrom( ) flags,sourceaddr,addrlength ) SendTo( ) RecvFrom( ) int sendto(sock,*buf, length, SendTo( ) flags,destaddr,addrlength ) Esercizio consigliato: IPC Macrolezione 05 (ipermediale) Inter-Process Communication