Winsock con VB6



Ormai tutti sanno programmare, qual’è adesso come adesso lo scoglio più grande per chi programma ? Passare a programmi che sfruttato le potenzialità della rete. Infatti raramente negli help troverete voci tipo “Internet” o altro di facilmente collegabile alla programmazione di “rete”. E al massimo quello che si trova è difficile da capire e ci sono degli esempi che servono a poco o a niente.

Invece è tutto molto semplice (per lo meno le basi) ed io sono riuscito a capire le basi in meno di un’ora grazie alle spiegazioni che ho trovato.

Allora.. In Visual Basic per fare programmi che sfruttano le potenzialità della rete (chat, finger, demoni, ecc..) abbiamo bisogno di un oggetto un po’ particolare.. Il Winsock.
E dove si trova il Winsock ? Aprite il vostro Visual Basic e andate nel menù progetto e selezionate componenti.
Adesso scorrete l’elenco degli oggetti fino a trovare Microsoft Winsock Control 5.0 (o versioni successivi.. Fate un po’ voi !!).
Mettete il segno di spunta lì vicino e cliccate Ok.
Adesso nella barra degli strumenti sarà apparita un icona con due computer. Andategli sopra con il mouse e apparirà la magica scritta.. “Winsock”. E adesso ?
Adesos bisogna inserirla nella form, no ? Selezionatela, posizionatevi nella form e inseritela.
Ecco, adesso siete pronti per cominciare a programmare in rete.

Ok, adesso devo aprire una piccola parentesi.. Il Winsock supporta i due principali protocolli della rete, cioè il TCP e l’ UDP.
Bhè, non sto qui a spiegarvi l’esatta differenza millesimale tra i due, dato che questo non è luogo e capirne la differenza non è essenziale.
Sappiate solo che i due protcolli sono diversi (se volete informarvi cercate qualche testo su tutte le ezine che ci sono in rete..) e che per i nostri scopi useremo principalmente il TCP.

Mh.. Onestamente con il winsock la teoria serve ben a poco e quindi passeremo subito alla pratica così vi spieghero’ passo a passo..
La prima cosa, la più elementare ? Un programma di chat tra due persone.. Per poi potersene vantarsene con gli amici.

________________________________________________
___________ ________ |
COLLEGATI A: |IP_________| |CONNETTI|__ |
SULLA PORTA: |PORTA______| |DISCONNETTI| |
|ASCOLTA_| |
___________ |
STATO DELLA CONNESSIONE: |STATO______| |
______________________________ |
| | |
|CHAT | |
| | |
| | |
| | |
|______________________________| |
________________ _____ |
|TESTO___________| |INVIA| |
|
________________________________________________|

Questo è il disegnino della chat, ora però devo dirmi i nomi altrimenti il codice che vi dò non vi và. Vi dò solo i nomi importanti, alcune label come Collegati a, Porta, ecc.. sono inifluenti.

Ip = txtip
porta = txtporta
Connetti = cmdconnetti
Disconnetti = cmddisconnetti
Ascolta = cmdascolta
stato = lblstato
chat = txtchat
testo = txttesto
invia = cmdinvia

Ricordatevi di impostare txtchat su multiline = true e scrollbars = 2-Vertical, magari anche locked = True..
Logicamente metteteci anche il controllo winsock e dategli come name TCP1

Ok, adesso vi passo il codice..

Private Sub cmdascolta_Click()
lblstato.Caption = “IN ASCOLTO”
TCP1.LocalPort = Val(txtporta)
TCP1.Listen
End Sub

Private Sub cmdconnetti_Click()
If (TCP1.State <> sckClosed) Then TCP1.Close
TCP1.LocalPort = 0
TCP1.Connect txtip, Val(txtporta)
End Sub

Private Sub cmdinvia_Click()
a$ = txttesto
txtchat = “Inviato:” & a$ & vbCrLf & txtchat
TCP1.SendData a$
End Sub

Private Sub cmdisconnetti_Click()
lblstato.Caption = “INATTIVO”
TCP1.Close
End Sub

Private Sub TCP1_Close()
lblstato.Caption = “INATTIVO”
TCP1.Close
End Sub

Private Sub TCP1_Connect()
lblstato.Caption = “ATTIVO”
txtip = TCP1.RemoteHost
End Sub

Private Sub TCP1_ConnectionRequest(ByVal requestID As Long)
If (TCP1.State <> sckClosed) Then TCP1.Close
TCP1.LocalPort = 0
TCP1.Accept requestID
lblstato.Caption = “ATTIVO”
txtip = TCP1.RemoteHostIP
End Sub

Private Sub TCP1_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
On Error Resume Next
TCP1.GetData Data
txtchat = “Ricevuto:” & Data & vbCrLf & txtchat
End Sub

Ecco qui.. 32 righe in tutto !! Per un chat (seppur molto basilare) sono poche.. Per il funzionamento: i computer devono essere due. Uno dei due mette un numero qualsiasi nella txt della porta e poi clicca “Ascolta”.
L’altro inserisce nella casella txtip l’ip del computer in ascolto e la porta su cui è in ascolto e clicca Connetti
Però sarà meglio che ve le spiego, vero ? Allora..

====================================================================

Private Sub cmdascolta_Click()
lblstato.Caption = “IN ASCOLTO”
TCP1.LocalPort = Val(txtporta)
TCP1.Listen
End Sub

Cliccando sul tasto “Ascolta” cambia la caption di lblstato. Ma questo lo vedete da soli.
In più cliccando su “Ascolta” il winsock tramite il protocollo TCP prende la porta che gli avete indicato in txt porta e poi si pone in ascolto su quella.

TCP1.LocalPort = Val(txtporta) ‘sceglie la porta
TCP1.Listen ‘si pone in ascolto

====================================================================

Private Sub cmdconnetti_Click()
If (TCP1.State <> sckClosed) Then TCP1.Close
TCP1.LocalPort = 0
TCP1.Connect txtip, Val(txtporta)
End Sub

Clicchiamo su Connetti.. Prima controlla che lo stato di TCP1 non si chiuso e poi imposta la porta locale a zero. Infine si collega all’ip che gli avete indicato in txtip sulla porta che gli avete indicato su txtporta

TCP1.Connect txtip [IP CHE GLI AVETE DATO], Val(txtporta) [PORTA CHE GLI AVETE DATO]

====================================================================

Private Sub cmdinvia_Click()
a$ = txttesto
txtchat = “Inviato:” & a$ & vbCrLf & txtchat
TCP1.SendData a$
End Sub

Mh..Qui analizziamo uno dei comandi più importanti del winsock.. SendData
Per chi sa l’inglese la comprensione è semplicissima !! SendData = spedisci dati.
Tramite questo comando (sintassi: NOMEWINSOCK.SendaData OGGETTODASPEDIRE ) spediamo al computer
con il quale siamo connessi una stringa di caratteri..
In questo caso spediamo la variabile a$ a cui attribuiamo il testo contenuto nella casella txttesto.
[ txtchat = “Inviato:” & a$ & vbCrLf & txtchat ] invece indica nella casella txtchat deve apparire il contenuto della variabile a$ preceduta dalla scritta “Inviato:” (così vediamo quello che abbiamo scritto noi e quello che abbiamo ricevuto) e seguita dal precedente contenuto di txtchat.
vbCrLf per chi non lo sapesse è uguale a Invio.

====================================================================

Private Sub cmdisconnetti_Click()
lblstato.Caption = “INATTIVO”
TCP1.Close
End Sub

C’è da poco spiegare.. Chiude la connessione tramite il comando close. L’altra riga cambia solo il contenuto della casella che indica lo stato della connessione.

====================================================================

Private Sub TCP1_Connect()
lblstato.Caption = “ATTIVO”
txtip = TCP1.RemoteHost
End Sub

Mh.. Quando la connessione è avvenuta (TCP1_Connect) nella casella txtip appare l’ip del computer remoto.

====================================================================

Private Sub TCP1_ConnectionRequest(ByVal requestID As Long)
If (TCP1.State <> sckClosed) Then TCP1.Close
TCP1.LocalPort = 0
TCP1.Accept requestID
lblstato.Caption = “ATTIVO”
txtip = TCP1.RemoteHostIP
End Sub

Già qui è la cosa è più interessante.. Allora..
Quando c’è una richiesta di connessione (TCP1_ConnectionRequest) il computer si comporta così:
La prima riga serve a dire che appena la connessione dell’altro computer si chiude (TCP1.State <> sckClosed) allora la nostra connessione a lui si interrompe.
La seconda riga setta la porta locale a 0.
La terza riga dice di accettare la connessione, la terza cambia lo stato della label (inutile ai fini della connessione, serve solo a noi per vedere meglio se la connessione è attiva o meno) e dice che la casella txtip deve assumere come valore l’indirizzo Ip del pc remoto..

====================================================================

Private Sub TCP1_DataArrival(ByVal bytesTotal As Long)
Dim Data As String
On Error Resume Next
TCP1.GetData Data
txtchat = “Ricevuto:” & Data & vbCrLf & txtchat
End Sub

Questa è la procedura che il programma segue in caso di arrivo di dati (TCP1_DataArrival).
Dim Data as String definisce i dati che arrivano (che per comodità ho chiamato data) come stringhe alfanumeriche.
On Error Resume Next vuole dire che in caso di errore di trasmissione i dati vengono spediti di nuovo.
TCP1.GetData Data dice che i dati ricevuti ( GetData ) dalla connessione prendono il nome di data.
txtchat = “Ricevuto:” & Data & vbCrLf & txtchat Con questa riga di comando i dati ricevuti vengono scritti nella casella txtchat preceduti da Ricevuto: e seguiti dal testo già presente nella chat.. E con questo ho finito.

====================================================================

Riepilogo delle principali funzioni di Winsock:

1.- Private Sub TCP1_DataArrival(ByVal bytesTotal As Long)
Indica al programma come comportarsi in caso di arrivo dati.

2.- GetData
Funzione del Winsock che indica al programma di prendere i dati e dargli un nome a scelta.
SINTASSI: nomeconnessione.GetData nomedeidati

3.- SendData
Funzione del Winsock che indica al programma di spedire i dati.
SINTASSI: nomeconnessione.SendData nomeoggettodaspedire

4.- Listen
Funzione del Winsock che dice al programma di mettersi in ascolto.
SINTASSI: nomeconnessione.Listen
IMPORTANTE: deve essere preceduto da LocalPort per impostare su quale porta il programma deve mettersi in ascolto

5.- LocalPort
Funzione del Winsock che imposta la porta.
SINTASSI: nomeconnessione.LocalPort = numeroporta

6.- Connect
Funzione del Winsock molto importante. Tramite questa inizia il collegamento.
SINTASSI: nomeconnessione.Connect ipacuicollegarsi, portaacuicollegarsi

7.- Private Sub TCP1_Connect()
Indica al programma come comportarsi una volta avvenuta la connessione

8.- Private Sub TCP1_Close()
Indica al programma come comportarsi una volta chiusa la connessione

9.- Close
Indica al programma di chiudere la connessione
SINTASSI: nomeconnessione.Close

10.- TCP1.Accept requestID
Indica al programma di accettare la connessione e l’ID che ci viene assegnato.

11.- State
Indica lo stato di connessione del programma, utile negli if. Esempio: se lo stato della connessione è sconnesso allora fai x.
SINTASSI: nomeconnessione.State valorecheassume
Valore che può assumere State:

sckClosed Impostazione predefinita. Chiuso
sckOpen Aperto
sckListening In attesa
sckConnectionPending Connessione in sospeso
sckResolvingHost Risoluzione dell’host in corso
sckHostResolved Host risolto
sckConnecting Connessione in corso
sckConnected Connesso
sckClosing Il client sta chiudendo la connessione
sckError Errore

Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
  • Fy

    “Ormai tutti sanno programmare”
    Frase ridicola oltre che falsa..
    a conferma del pensiero di molte persone che confondono il saper programmare con il “riuscire a realizzare qualcosina scopiazzando un po’ di codice”

Pinterest