-
Prefazione:In questa guida spiegherò il concetto base per la creazione di un client e server. Prima di leggere questa guida consiglio di conoscere abbastanza bene i concetti di base.
-
Introduzione:
Le connessioni in tcp si basano su due concetti fondamentali:
-la creazione dei socket di connessione;
-la trasmissione e ricezione di stringhe.
Prima di iniziare qualsiasi script, bisogna ricordarsi di utilizzare la funzione TCPStartup() all'inizio dello script, altrimenti tutte le funzioni non funzioneranno correttamente.
-
I comandi:
-
TCPStartup: avvia il servizio tcp;
-
TCPConnect: si connette al server desiderato;
-
TCPListen: avvia il socket per la ricezione;
-
TCPAccept: accetta una connessione in entrata
-
TCPSend: invia una stringa al client o server;
-
TCPRecv: riceve le stringhe;
-
TCPCloseSocket: chiude la connessione;
-
TCPShutdown: arresta il servizio;
Per spiegare il funzionamento delle funzioni, creeremo una piccola e semplice chat.
-
Connessione:
-Client:
CODICE
TCPStartup() ;avviamo il servizio TCP
$ip=InputBox("Chat","Inserisci l'ip:",@IPAddress1,"",50,50) ;richiesta dell'ip
If $ip="" Then Exit
$porta=1234 ;porta di connessione
$socket=TCPConnect($ip,$porta) ;si connette al server specificato
If $socket=-1 Then ;se non si riesce a collegare ritorna un errore esce
MsgBox(16,"errore","errore nella connessione",5)
Exit
Else
MsgBox(0,"chat","Connesso con successo.")
Exit
EndIf
-Server:
CODICE
TCPStartup() ;avviamo il servizio TCP
$listen=TCPListen(@IPAddress1,1234) ;si mette in ascolto sull'ip locale e la porta 1234
While 1
$socket=TCPAccept($listen)
If $socket <> -1 Then ExitLoop
WEnd
MsgBox(0,"server","connesso")
Vediamo di spiegare come funzionano questi due script.
-
Server: dopo aver avviato il servizio tcp, il server crea una connessione tramite la funzione
TCPListen sull'ip locale, definito dalla macro @ipaddress1, e la porta 1234. A questo punto si mette in un ciclo infinito in cui controlla continuamente se è avvenuta una connessione, ovvero il valore di $socket sia diverso da -1, cioè errore. Quando $socket non risulta come errore, significa che la connessione è avvenuta con successo e continua lo script.
-
Client: dopo aver avviato il servizio TCP, richiede all'utente l'indirizzo a cui collegarsi(se siete in locale lasciate così). La funzione
TCPConnect provvederà a connettersi con il server sulla porta 1234. Se la connessione non è avvenuta, il valore di $socket risulterà -1 e quindi lo script uscirà.
N.B.: Ricordatevi che bisogna avviare prima il server e poi il client, altrimenti non funzionerà.-
Invio e ricezione dei dati:
Per concludere vediamo come inviare dei messaggi:
-Client:
CODICE
;client
TCPStartup() ;avviamo il servizio TCP
#include <GuiConstants.au3>
#include <GuiEdit.au3>
$ip=InputBox("Chat","Inserisci l'ip:",@IPAddress1,"",50,50) ;richiesta dell'ip
If $ip="" Then Exit
$porta=1234 ;porta di connessione
$socket=TCPConnect($ip,$porta) ;si connette al server specificato
If $socket=-1 Then ;se non si riesce a collegare ritorna un errore esce
MsgBox(16,"errore","errore nella connessione",5)
Exit
EndIf
;altrimenti crea una gui
GUICreate("Chat",300,240)
$edit=GUICtrlCreateEdit("",0,0,300,200)
$msg=GUICtrlCreateInput("",10,210,200,20)
$send=GUICtrlCreateButton("Invia",215,210,80,20)
GUISetState()
While 1
;controllo della gui
Switch GUIGetMsg()
Case $gui_event_close
Exit
Case $send
$msg1=GUICtrlRead($msg)
TCPSend($socket,$msg1)
GUICtrlSetData($msg,"")
EndSwitch
$recv=TCPRecv($socket,2048) ;attende una stringa
If $recv <> "" Then ;se riceve una stringa allora scrive nell'edit
_GUICtrlEdit_AppendText($edit,$recv & @CRLF)
EndIf
WEnd
-Server:
CODICE
;server
TCPStartup() ;avviamo il servizio TCP
#include <GuiConstants.au3>
#include <GuiEdit.au3>
$listen=TCPListen(@IPAddress1,1234) ;si mette in ascolto sull'ip locale e la porta 1234
While 1
$socket=TCPAccept($listen)
If $socket <> -1 Then ExitLoop
WEnd
GUICreate("Chat",300,240)
$edit=GUICtrlCreateEdit("",0,0,300,200)
$msg=GUICtrlCreateInput("",10,210,200,20)
$send=GUICtrlCreateButton("Invia",215,210,80,20)
GUISetState()
While 1
;controllo della gui
Switch GUIGetMsg()
Case $gui_event_close
Exit
Case $send
$msg1=GUICtrlRead($msg)
TCPSend($socket,$msg1)
GUICtrlSetData($msg,"")
EndSwitch
$recv=TCPRecv($socket,2048) ;attende una stringa
If $recv <> "" Then ;se riceve una stringa allora scrive nell'edit
_GUICtrlEdit_AppendText($edit,$recv & @CRLF)
EndIf
WEnd
Una volta che si sono connessi, il client e il server creano la gui per la chat con un edit per la ricezione dei messaggi e un'input per l'invio.
-
Invio: quando si clicca sul pulsante "Invia", il programma legge l'input e invia la stringa tramite la funzione
TCPSend, che richiede come parametri il socket di connessione relativo alla funzione
TCPConnect(nel nostro caso $socket), e la stringa da inviare, che nel nostro caso è l'input.
-
Ricezione: il programma riceve continuamente i dati dal socket attraverso la funzione
TCPRecv. Nel caso ricevesse una stringa
non vuota, va a scrivere nell'edit. I parametri richiesti dalla funzione sono il socket di connessione(nel nostro caso $socket, ovvero quello relativo alla funzione
TCPAccept) e il numero massimo di caratteri, che nel nostro caso sono 2048. Questo serve a impostare il limite massimo di caratteri.
Copyright by Misterx