Controllo Winsock VB6
Transcript
Controllo Winsock VB6
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 Connect ConnectionRequest DataArrival Error SendComplete SendProgress Viene generato quando la connessione è stata chiusa Viene generato quando l'operazione di connessione viene completata Viene generato quando un client remoto tenta di connettersi Viene generato quando si ricevono dati dal computer remoto Si è verificato un errore Viene generato dopo il completamento di un'operazione di invio 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 Private Sub Form_Load() ‘Inizializzazione della socket Winsock1.Protocol = sckUDPProtocol Winsock1.LocalPort = 8001 Winsock1.Bind End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) ‘Legge i dati arrivati e li visualizza Dim Msg As String Winsock1.GetData Msg Me.Print Msg & “ from “ & Winsock1.RemoteHostIP End Sub PROGRAMMA SEND Private Sub Form_Load() ‘Inizializza la socket Winsock1.Protocol = sckUDPProtocol Winsock1.RemoteHost = "127.0.0.1" Winsock1.RemotePort = 8001 End Sub Private Sub SendButton_Click() ‘Invia i dati (ora attuale) sulla socket Winsock1.SendData Format(Now,”hh:mm:ss”) End Sub 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 Private Sub Form_Load() 'Inizializza la socket e si mette in ascolto Winsock1.Protocol = sckTCPProtocol Winsock1.LocalPort = 8001 Winsock1.Listen End Sub Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) 'Verifica se possibile accettare connessione If Winsock1.State <> sckClosed Then Winsock1.Close 'Accetta la nuova connessione Winsock1.Accept requestID End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) 'Legge i dati in arrivo e li visualizza Dim Msg As String Winsock1.GetData Msg Me.Print Msg & “ from “ & Winsock1.RemoteHostIP End Sub Private Sub Winsock1_Close() 'Chiude la connessione e si rimette in ascolto Winsock1.Close Winsock1.Listen End Sub PROGRAMMA CLIENT Private Sub Form_Load() 'Inizializza il socket e richiede connessione Winsock1.Protocol = sckTCPProtocol Winsock1.RemoteHost = "127.0.0.1" Winsock1.RemotePort = 8001 End Sub Private Sub ConnectButton_Click() 'Richiede la connessione Winsock1.Connect End Sub Private Sub Winsock1_Connected() 'Connessione completata, ora è possibile scambiare dati SendButton.Enabled = True End Sub Private Sub SendButton_Click() 'Invia i dati (ora attuale) sulla socket e chiude la connessione If Winsock1.State = sckConnected Then Winsock1.SendData Format(Now, "hh:mm:ss") End If End Sub Private Sub CloseButton_Click() 'Chiude la connessione Winsock1.Close End Sub 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 Winsock1.Close cmdConnect.Caption = "Connect" lblStatus.Caption = "Disconnected" End If Exit Sub Connect_Err: MsgBox Err.Description End Sub Private Sub cmdSend_Click() If Winsock1.State = sckConnected Then Winsock1.SendData txtSentData.Text End If End Sub Private Sub Winsock1_Close() Winsock1.Close cmdConnect.Caption = "Connect" lblStatus.Caption = "Disconnected" End Sub Private Sub Winsock1_Connect() lblStatus.Caption = "Connected with " & Winsock1.RemoteHostIP End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim msg As String Winsock1.GetData msg txtRecvData.Text = txtRecvData.Text & msg txtRecvData.SelStart = Len(txtRecvData.Text) End Sub 4 Server TCP Universale Private Sub cmdListen_Click() On Error GoTo Listen_Err If cmdListen.Caption = "Listen" Then Winsock1.LocalPort = txtLocalPort.Text Winsock1.Listen cmdListen.Caption = "Close" lblStatus.Caption = "Listening..." Else Winsock1.Close cmdListen.Caption = "Listen" lblStatus.Caption = "Disconnected" End If Exit Sub Listen_Err: MsgBox Err.Description End Sub Private Sub cmdSend_Click() If Winsock1.State = sckConnected Then Winsock1.SendData txtSentData.Text End If End Sub Private Sub Winsock1_Close() Winsock1.Close lblStatus.Caption = "Disconnected" cmdListen.Caption = "Listen" End Sub Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) If Winsock1.State <> sckClosed Then Winsock1.Close Winsock1.Accept requestID lblStatus.Caption = "Connected with " & Winsock1.RemoteHostIP End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim msg As String Winsock1.GetData msg txtRecvData.Text = txtRecvData.Text & msg txtRecvData.SelStart = Len(txtRecvData.Text) End Sub 5