Programmazione Client/Server con il controllo Winsock Edizione 1.3

Post on 21-Jan-2016

68 views 2 download

description

Programmazione Client/Server con il controllo Winsock Edizione 1.3. a cura di Marco Zucchini. Obiettivo generale. Far dialogare tra di loro due processi in esecuzione su due calcolatori (Host) distinti collegati in rete con protocollo TCP/IP. Obiettivo specifico. - PowerPoint PPT Presentation

Transcript of Programmazione Client/Server con il controllo Winsock Edizione 1.3

Programmazione Client/Servercon il controllo Winsock

Edizione 1.3

a cura di Marco Zucchini

Obiettivo generale

• Far dialogare tra di loro due processi in esecuzione su due calcolatori (Host) distinti collegati in rete con protocollo TCP/IP

Obiettivo specifico

Approfondire la metodologia Client/Server

• Un’ applicazione Server in esecuzione su un determinato calcolatore (collegato in Internet) offre un certo tipo di servizio.

• Più applicazioni Client, si collegano all’applicazione Server per ottenere quello specifico servizio.

Il modo migliore per fare qualcosa è quello di farlo fare a qualcun altro.

Implementazione tecnicadella metodologia Client/Server

Le Socket

Connessione

• Identificata da una coppia di socket

Internet

Server Client

TCP/IP

Applicazione Applicazione

TCP/IP

SocketSocket

Schema dei livelli TCP/IP

Applicazione

Livello Ip

Livello fisico

TCP UDP

Internet

Gateway Gateway

Applicazione

Livello Ip

Livello fisico

TCP UDP

Host A Host B

OSI 3

OSI 4

Concetto di Socket

• Punto terminale di comunicazione fra processi

• Individuata univocamente da:– Protocollo usato – Indirizzo IP del calcolatore– Un numero di porta

Protocollo

• TrasmissionControlProtocol – Stabilisce una

connessione tra client e server

– Garantisce la consegna di tutti pacchetti senza errori

– Più complesso da gestire

– Più lento

• UserDatagramProtocol

• Non stabilisce alcuna connessione

• Non garantisce l’arrivo dei messaggi inviati

• Non garantisce l’ordine di arrivo rispetto a quello di partenza

• Facile da gestire

• Veloce

Identifica il tipo di comunicazione.

N.B. TCP e UDP corrispondono al livello 4 del modello OSI

Con connessione ed affidabile Senza connessione ed inaffidabile

Schema di comunicazione TCP

Processo A

Processo B

Processo C

Processo D

Analogia di connessioneTCP

Conversazione telefonica tra due interlocutori

• Inizia la conversazione solo uno dei due (Client), ovvero colui che conosce il numero di tel. del secondo interlocutore (Server)

• Quindi la conversazione ha modo di proseguire in modo simmetrico

Indirizzo IP

• Identifica univocamente calcolatore connesso in Internet/Intranet

• Identifica dunque il calcolatore su cui è in esecuzione l’applicazione Client o Server da contattare

Esempio (indirizzo IP)192.168.0.1

N.B. L’IP di default di un elaboratore non connesso in rete è 127.0.0.1

La Porta

• Identifica univocamente l’applicazione Client o Server con cui stabilire una connessione

• E’ un numero intero compreso tra 0 e 65535

Esempio (indirizzo IP + porta)

192.168.0.1:80

Porte predefinite

• E’ consuetudine che i servizi Internet più diffusi vengano associati alle stesse porte.

N.ro porta Servizio

21 FTP

23 TELNET

25 SMTP

53 DNS

80 WWW

Utilizzare le Socket

in Visual Basic 6

Il controllo Winsock

• Controllo OCX di Visual Basic che permette di creare e gestire le socket

Microsoft Winsock Control 6

Progetto -> Componenti

Come programmare il Client ed il Server

Schema di chiamate

Imposta_socket()

Listen()

Accept()

GetData()

SendData()

Si blocca sino alla connessione con il client

Imposta_socket()

Connect()

SendData()

GetData()

Elaborazione

Close() Close()

Impostazione del socket - Server• Proprietà LocalHostName

– Restituisce il nome dell’Host localeEsempi sHost= ServerSocket.LocalHostName ‘Ottiene il nome dell’HOST

• Proprietà LocalIP– Restituisce l’IP dell’Host localeEsempi sIP= ServerSocket.LocalIP ‘Ottiene l’IP

• Proprietà LocalPort– Imposta/restituisce il numero della porta locale Esempi ServerSocket.LocalPort=1007 ‘ Imposta la porta lPort= ServerSocket.LocalPort ‘Ottiene il valore della porta

Impostazione del socketClient

• Proprietà RemoteHost– Imposta/restituisce l’IP/DNS dell’Host remoto (Server)Esempi ClientSocket.RemoteHost=“127.0.0.1” ‘Imposta l’IP dell’Host

sHost= ClientSocket.RemoteHost ‘Ottiene l’IP dell’Host

• Proprietà RemotePort– Imposta/restituisce la porta di connessione con il ServerEsempi ClientSocket.RemotePort=1007 ‘ Imposta la porta lPort= ClientSocket.RemotePort ‘Ottiene il valore della porta

Metodo ListenServer

• Metodo Listen– Mette il Server in attesa di una richiesta di

connessione da parte di un client

Esempi

ServerSocket.Listen

Metodo ConnectClient

• Metodo Connect– Consente al Client di richiedere una connessione al

computer remoto– Occorre prima specificare l’indirizzo IP del

computer remoto e la porta a cui connettersi (proprietà RemoteHost e RemotePort)

Esempio

ClientSocket.Connect

Evento ConnectionRequestServer

• Evento ConnectionRequest– Si verifica quando il server riceve una richiesta di

connessione da parte del client.– Il parametro requestID identifica la richiesta di

connessione

Esempio

Private Sub ServerSocket_ConnectionRequest(ByVal RequestID As Long) …..EndSub

Metodo AcceptServer

• Metodo Accept– Consente al server di accettare una richiesta proveniente

da un client.– L’accettazione deve essere fatta nell’ambito della

gestione dell’evento ConnectionRequest– Il parametro RequestID viene passato al metodo Accept

che accetta quella particolare connessione.Esempio

Private Sub ServerSocket_ConnectionRequest(ByVal RequestID As Long) ServerSocket.Accept RequestID

EndSub

Evento DataArrivalClient/Server

• Evento DataArrival– Si verifica quando arrivano nuovi dati.– Il parametro bytesTotal contiene quanti dati (in byte)

sono arrivati

EsempioPrivate Sub ServerSocket_DataArrival(ByVal bytesTotal As Long) …..EndSub

Metodo GetDataClient/Server

• Metodo GetData– Legge i dati contenuti nel buffer di input e li memorizza in una variabile.– Usato in concomitanza conl’evento DataArrival

EsempioPrivate Sub ServerSocket_DataArrival(ByVal bytesTotal As Long) Dim InDataVar As String ….. Socket.GetData InDataVarEndSub

Metodo SendDataClient/Server

• Metodo SendData– Invia i dati specificati in una variabile– Usato in concomitanza conl’evento DataArrival

EsempioPrivate Sub SocketServer_DataArrival(ByVal bytesTotal As Long) Dim OutDataVar As String ….. Socket.SendData OutDataVarEndSub

Metodo CloseClient/Server

• Metodo Close– Termina una connessione TCP.

Esempio

Socket.Close

Proprietà StateClient/Server

• Proprietà State– Restituisce lo stato del Socket – Codice numerico (vedi tabella) cui corrisponde una

costante predefinita.

EsempioiVal=Socket.State

Costante Valore Descrizione

sckClosed 0 Chiuso (default)

sckOpen 1 Aperto

sckConnected 7 Connessione completata

Un esempio concreto

Client/Server ECHO

EsercizioECHO

Implementare un sistema Client/Server costituito da:– Uno o più Client, in grado di:

• connettersi al server

• inviare un messaggio a scelta (es.”ciao”)

• ricevere e visualizzare lo stesso messaggio proveniente dal server.

– Un Server, in grado di:• accettare connessioni da uno o più Client “Echo”

• ricevere i messaggi inviati dai client e rispedirli al mittente

Il Server

La seguente versione è in grado di accettare e gestire contemporaneamente connessioni da più client, ciascuna

su uno specifico socket .

Dim iSockets As Integer

Private Sub Form_Load()

iSockets = 0

frmMain.Show

ServerSocket(0).Protocol=sckTCPProtocol

txtHost.Text=ServerSocket(0).LocalHostName

txtIP.Text=ServerSocket(0).LocalIP

ServerSocket(0).LocalPort = 1007

ServerSocket(0).Listen

End Sub

Imposta_socket()

Listen()

Si blocca sino alla connessione con il client

Private Sub ServerSocket_ConnectionRequest( Index As Integer, _

ByVal requestID As Long)

MsgBox " Pervenuta richiesta di connessione !!! Ok Per accettarla !!!"

If Index = 0 Then ‘ se è un tentativo di connessione al server

iSockets = iSockets + 1

Load ServerSocket(iSockets)

ServerSocket(iSockets).LocalPort = 1007

ServerSocket(iSockets).Accept requestID

End If

End Sub

Accept()

Viene allocato un socket specifico, identificato da Index, per gestire lo scambio di informazioni con il client

Private Sub ServerSocket_DataArrival( Index As Integer, _

ByVal requestID As Long)

Dim sData As String

ServerSocket(Index).GetData sData, vbString

txtDisplay.Text=sData

ServerSocket(Index).SendData sData

End Sub

GetData()

SendData()

Elaborazione

Sul socket identificato da Index viene gestito lo scambio di informazioni con il client

Private Sub ServerSocket_Close ( Index As Integer)

ServerSocket(Index).Close

Unload ServerSocket(Index)

iSockets = iSockets – 1

End Sub

Close()

Viene deallocato il socket identificato da Index che si occupava della connessione con il client

Il Client

Dim sData As String

Private Sub Form_Load()

ClientSocket.Protocol=sckTCPProtocol

ClientSocket.RemoteHost = "127.0.0.1"

ClientSocket.RemotePort = 1007

sData=“Ciao!!!”

End Sub

Imposta_socket()

‘Bottone per l’avvio della connessione

Private Sub cmdConnect_Click()

ClientSocket.Connect

End Sub

Connect()

‘ Bottone per l’invio dei dati

Private Sub cmdSend_Click()

If (ClientSocket.State = sckConnected) Then

ClientSocket.SendData sData

Else

MsgBox "Connessione non attiva !!!"

End If

End Sub

‘Evento di rilevazione avvenuta trasmissione

Private Sub ClientSocket_SendComplete()

txtDisplay.Text = txtDisplay.Text + "Trasmissione completata !!!" + vbCrLf

End Sub

SendData()

Private Sub ClientSocket_DataArrival( ByVal requestID As Long)

ClientSocket.GetData sData, vbString

txtDisplay.Text=sData

End Sub

GetData()

‘ Bottone per la terminazione della connessione

Private Sub cmdClose_Click()

ClientSocket.Close

End Sub

‘ Bottone per la terminazione dell’applicazione

Private Sub cmdEnd_Click()

ClientSocket.Close

End

End Sub

Close()

Appendice

EsercizioRisolutore DNS

Implementare un sistema Client/Server costituito da:– Uno o più Client, in grado di:

• connettersi al server

• inviare un DNS per la decodifica (es.www.isii.it)

• ricevere e visualizzare l’equivalente indirizzo IP o un eventuale messaggio di errore (es. DNS non valido)

– Un Server, in grado di:• accettare connessioni da uno o più Client

• Riconoscere un DNS valido e trasformarlo in un IP equivalente

• Inviare al client richiedente l’IP appena determinato o eventuale messaggio di errore (es. DNS non valido)

EsercizioScanner IP

• Implementare un sistema Client “Scanner” in grado di analizzare eventuali porte aperte da qualche software Server in esecuzione su un generico Host connesso ad internet/intranet.

Esercizio

Client/Server FTP

• Implementare un sistema Client/Server in grado di gestire un servizio FTP, ovvero di trasferire uno o più file da un PC client ad un PC server e viceversa.

EsercizioFile sharing

• Implementare un sistema Client/Server in grado di consentire la condivisione di file di testo (ed eventualemnte binari) tra più utenti collegati.

EsercizioChat multiutente

• Implementare un sistema Client/Server in grado di gestire una Chat multiutente con la possibilità di limitare la comunicazione solo tra alcuni client connessi (virtual rooms).

EsercizioClient/Server WEB• Implementare un sistema Client/Server Web

composto da quanto segue:• un server web capace di inviare pagine html a

client web (browser) che ne fanno richiesta• Un’applicazione Client Web capace di:

– richiedere pagine html al server di cui sopra– ricevere tali pagine, interpretarne il contenuto (espresso

secondo una sintassi html minimale) ed eseguire quanto espresso dai tag incontrati

– gestire problematiche di errore visualizzando messaggi opportuni

Bibliografia

R.Thayer

Visual Basic 6

Apogeo

A. Tanenbaum

Reti di Computer (II Ed.)

G.E.Jackson

Dev Ottobre 1996

Internet Programming & Client/Server

Edizioni Infomedia

Sul Web

• http://www.vbp.it

• http://www.redangel.it