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