490 likes | 668 Views
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.
E N D
Programmazione Client/Servercon il controllo WinsockEdizione 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 Applicazione Applicazione Socket Socket TCP/IP TCP/IP Internet Client Server
Schema dei livelli TCP/IP Applicazione Applicazione TCP UDP TCP UDP OSI 4 Livello Ip Livello Ip OSI 3 Livello fisico Livello fisico Host B Host A Gateway Gateway Internet
Concetto di Socket • Punto terminale di comunicazione fra processi • Individuata univocamente da: • Protocollo usato • Indirizzo IP del calcolatore • Un numero di porta
Protocollo Identifica il tipo di comunicazione. Con connessione ed affidabile Senza connessione ed inaffidabile • 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 N.B. TCP e UDP corrispondono al livello 4 del modello OSI
Schema di comunicazione TCP Processo A Processo C Processo B 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
N.ro porta Servizio 21 FTP 23 TELNET 25 SMTP 53 DNS 80 WWW Porte predefinite • E’ consuetudine che i servizi Internet più diffusi vengano associati alle stesse porte.
Utilizzare le Socket in Visual Basic 6
Il controllo Winsock • Controllo OCX di Visual Basic che permette di creare e gestire le socket Progetto -> Componenti Microsoft Winsock Control 6
Schema di chiamate Server Client Imposta_socket() Listen() Si blocca sino alla connessione con il client Imposta_socket() Connect() Accept() GetData() SendData() R/W Elaborazione SendData() GetData() Close() Close()
Impostazione del socket - Server • Proprietà LocalHostName • Restituisce il nome dell’Host locale Esempi sHost= ServerSocket.LocalHostName ‘Ottiene il nome dell’HOST • Proprietà LocalIP • Restituisce l’IP dell’Host locale Esempi 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 Server Esempi 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 Esempio • Private 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 Esempio Private Sub ServerSocket_DataArrival(ByVal bytesTotal As Long) Dim InDataVar As String ….. Socket.GetData InDataVar EndSub
Metodo SendDataClient/Server • Metodo SendData • Invia i dati specificati in una variabile • Usato in concomitanza conl’evento DataArrival Esempio Private Sub SocketServer_DataArrival(ByVal bytesTotal As Long) Dim OutDataVar As String ….. Socket.SendData OutDataVar EndSub
Metodo CloseClient/Server • Metodo Close • Termina una connessione TCP. Esempio Socket.Close
Costante Valore Descrizione sckClosed 0 Chiuso (default) sckOpen 1 Aperto sckConnected 7 Connessione completata Proprietà StateClient/Server • Proprietà State • Restituisce lo stato del Socket • Codice numerico (vedi tabella) cui corrisponde una costante predefinita. Esempio iVal=Socket.State
Un esempio concreto Client/Server ECHO
Esercizio ECHO 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 Server Imposta_socket() Listen() Si blocca sino alla connessione con il client
Server 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
Server 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() Elaborazione SendData() Sul socket identificato da Index viene gestito lo scambio di informazioni con il client
Server 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
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()
Client ‘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 Client SendData()
Client Private Sub ClientSocket_DataArrival( ByVal requestID As Long) ClientSocket.GetData sData, vbString txtDisplay.Text=sData End Sub GetData()
Client ‘ 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()
Esercizio Risolutore 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)
Esercizio Scanner 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.
Esercizio File sharing • Implementare un sistema Client/Server in grado di consentire la condivisione di file di testo (ed eventualemnte binari) tra più utenti collegati.
Esercizio Chat 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).
Esercizio Client/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