Controllo Winsock di Visual Basic Il controllo Winsock, non visibile all'utente, consente di accedere ai servizi di rete TCP e UDP. Per creare applicazioni client o server non è necessario conoscere in maniera approfondita il TCP o richiamare API Winsock di basso livello (simili alle system call socket di Unix). Impostando le proprietà e attivando i metodi del controllo (object oriented e event driven), è possibile connettersi a un computer remoto e trasferire i dati in entrambe le direzioni. Proprietà (strutture dati della socket) BytesReceived LocalHostName LocalIP LocalPort Protocol RemoteHost RemoteHostIP RemotePort State Restituisce il numero di byte ricevuti sulla connessione Restituisce il nome del computer locale Restituisce l'indirizzo IP del computer locale Restituisce o imposta la porta utilizzata nel computer locale Restituisce o imposta il protocollo della socket Restituisce o imposta il nome utilizzato per identificare il computer remoto Restituisce l'indirizzo IP dell'host remoto Restituisce o imposta la porta a cui connettersi sul computer remoto Restituisce lo stato della connessione della socket Metodi (primitive socket) Accept Bind Close Connect GetData Listen PeakData SendData Accetta una richiesta di connessione Associa la socket a una porta e a una scheda specifica Chiude la connessione corrente Connessione a un computer remoto Recupera i dati inviati dal computer remoto In attesa di richieste di connessione Controlla i dati in arrivo senza rimuoverli dal buffer Invia i dati al computer remoto Eventi (notifica di eventi a cui rispondere) Close Viene generato quando la connessione è stata chiusa Connect Viene generato quando l'operazione di connessione viene completata ConnectionRequest Viene generato quando un client remoto tenta di connettersi DataArrival Viene generato quando si ricevono dati dal computer remoto Error Si è verificato un errore SendComplete Viene generato dopo il completamento di un'operazione di invio SendProgress Viene generato durante il processo di invio dei dati Selezione del protocollo Quando si utilizza il controllo WinSock, è innanzitutto necessario considerare se è preferibile utilizzare il protocollo TCP o il protocollo UDP. La scelta del protocollo è in genere determinata dal tipo di applicazione che si desidera creare. 1. Stabilire se l'applicazione richiederà un riconoscimento da parte del server o del client all'invio o alla ricezione dei dati. In caso affermativo, il protocollo TCP richiede una connessione esplicita prima di inviare o ricevere dati. 2. Stabilire se i dati saranno di grandi dimensioni, ad esempio nel caso di file immagine o audio. Dopo aver stabilito la connessione, il protocollo TCP la mantiene e garantisce l'integrità dei dati. Questa connessione, tuttavia, utilizza una maggior quantità di risorse. 3. Stabilire se i dati verranno inviati in un'unica sessione o in sessioni diverse. Se ad esempio si desidera creare un'applicazione che notifica a determinati computer il completamento di particolari operazioni, il protocollo UDP può essere la scelta migliore. Il protocollo UDP è inoltre più adatto all'invio di piccole quantità di dati. 1
Protocollo UDP Il protocollo UDP (User Datagram Protocol) è un protocollo senza connessione. La creazione di un'applicazione UDP è più semplice della creazione di un'applicazione TCP, perché il protocollo UDP non richiede una connessione esplicita. Quando si crea un'applicazione che utilizza il protocollo UDP, un programma riceve i dati, mentre un altro programma li invia sulla socket in modalità datagram. PROGRAMMA RECEIVE Inizializzazione della socket Winsock1.Protocol = sckudpprotocol Winsock1.LocalPort = 8001 Winsock1.Bind Legge i dati arrivati e li visualizza Dim Msg As String Winsock1.GetData Msg Me.Print Msg & from & Winsock1.RemoteHostIP PROGRAMMA SEND Inizializza la socket Winsock1.Protocol = sckudpprotocol Winsock1.RemoteHost = "127.0.0.1" Winsock1.RemotePort = 8001 Private Sub SendButton_Click() Invia i dati (ora attuale) sulla socket Winsock1.SendData Format(Now, hh:mm:ss ) 2
Protocollo TCP Il protocollo TCP (Transfer Control Protocol) consente di creare e mantenere una connessione con un computer remoto. Dopo aver stabilito la connessione, entrambi i computer possono inviare e ricevere dati. Quando si crea un'applicazione che utilizza il protocollo TCP, è innanzitutto necessario decidere se tale applicazione sarà server o client. Se l'applicazione è un server rimarrà in "ascolto" su una determinata porta. Quando il client invia una richiesta di connessione, il server potrà accettare tale richiesta e completare la connessione. Client e server potranno quindi comunicare. PROGRAMMA SERVER 'Inizializza la socket e si mette in ascolto Winsock1.Protocol = scktcpprotocol Winsock1.LocalPort = 8001 Private Sub Winsock1_ConnectionRequest(ByVal requestid As Long) 'Verifica se possibile accettare connessione If Winsock1.State <> sckclosed Then 'Accetta la nuova connessione Winsock1.Accept requestid 'Legge i dati in arrivo e li visualizza Dim Msg As String Winsock1.GetData Msg Me.Print Msg & from & Winsock1.RemoteHostIP 'Chiude la connessione e si rimette in ascolto PROGRAMMA CLIENT 'Inizializza il socket e richiede connessione Winsock1.Protocol = scktcpprotocol Winsock1.RemoteHost = "127.0.0.1" Winsock1.RemotePort = 8001 Private Sub ConnectButton_Click() 'Richiede la connessione Winsock1.Connect Private Sub Winsock1_Connected() 'Connessione completata, ora è possibile scambiare dati SendButton.Enabled = True Private Sub SendButton_Click() 'Invia i dati (ora attuale) sulla socket e chiude la connessione Winsock1.SendData Format(Now, "hh:mm:ss") Private Sub CloseButton_Click() 'Chiude la connessione 3
Client TCP Universale Private Sub cmdconnect_click() On Error GoTo Connect_Err If cmdconnect.caption = "Connect" Then Winsock1.Connect txtremotehost.text, txtremoteport.text cmdconnect.caption = "Close" lblstatus.caption = "Connecting..." Else cmdconnect.caption = "Connect" Exit Sub Connect_Err: MsgBox Err.Description Private Sub cmdsend_click() Winsock1.SendData txtsentdata.text cmdconnect.caption = "Connect" Private Sub Winsock1_Connect() lblstatus.caption = "Connected with " & Winsock1.RemoteHostIP Dim msg As String Winsock1.GetData msg txtrecvdata.text = txtrecvdata.text & msg txtrecvdata.selstart = Len(txtRecvData.Text) 4
Server TCP Universale Private Sub cmdlisten_click() On Error GoTo Listen_Err If cmdlisten.caption = "Listen" Then Winsock1.LocalPort = txtlocalport.text cmdlisten.caption = "Close" lblstatus.caption = "Listening..." Else cmdlisten.caption = "Listen" Exit Sub Listen_Err: MsgBox Err.Description Private Sub cmdsend_click() Winsock1.SendData txtsentdata.text cmdlisten.caption = "Listen" Private Sub Winsock1_ConnectionRequest(ByVal requestid As Long) If Winsock1.State <> sckclosed Then Winsock1.Accept requestid lblstatus.caption = "Connected with " & Winsock1.RemoteHostIP Dim msg As String Winsock1.GetData msg txtrecvdata.text = txtrecvdata.text & msg txtrecvdata.selstart = Len(txtRecvData.Text) 5