Exemple de connexion client-serveur tcp et udp

Description

Voici un code documenté afin de donner un exemple simple d'utilisation des socket via Tcp et Udp. Que cela soit en mode client ou serveur.

Le code, l'exe et surtout la documentation se trouvent à l'adresse suivante :

http://www.frameip.com/vb_mode_tcp_udp/

_SebF

http://www.frameip.com
Un site pour les spécialistes IP

Source / Exemple :


En TCP
-------------

Private Sub CheckState_Timer()
If Clients.ListCount = 0 Then send.Enabled = False Else: send.Enabled = True 'Si il n'y a pas de client, pourquoi envoyer un message?
If Ecoute.State = 0 Then Go.Caption = "Écouter" Else: Go.Caption = "Arrêter le serveur" 'Placer le texte du bouton Go
End Sub

Private Sub Clients_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbRightButton And Clients.ListIndex <> -1 Then 'Si on clique avec le bouton droit et qu'on a sélectionner un ip dans la liste, on affiche le menu
PopupMenu pop
End If
End Sub

Private Sub Decon_Click() 'ON LE BOOT!!
Dim col
col = Split(Clients.List(Clients.ListIndex), ":") 'On récuprère son # de socket (après le ":")
Socket_Close (CInt(col(1))) 'On fait comme s'il aurait quitté
End Sub

Private Sub Ecoute_ConnectionRequest(ByVal requestID As Long) 'Demande de connexion
Dim Nb As Integer
Nb = Socket.Count '# de la prochaince socket disponible (LIMITE : 65535 CAR TYPE INTEGER = SUR 4 OCTETS (FFFF))
Load Socket(Nb) 'On charge ce socket
Socket(Nb).Accept requestID 'On fait accepter la connexion
recep.Text = recep.Text & recep.Text & "<system> : Connexion établie avec " & Socket(Nb).RemoteHostIP & " !" & vbCrLf & vbCrLf 'On dit que le client c'est connecté
Clients.AddItem Socket(Nb).RemoteHostIP & ":" & Nb 'On met son IP suivit de ":" et son 1 de socket dans la liste
End Sub

Private Sub Ecoute_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) 'Erreur!
MsgBox "Erreur avec le socket! & vbcrlf # " & Number & vbCrLf & Description
Ecoute.Close
End Sub

Private Sub Form_Load()
CheckState_Timer 'On fait faire une première vérification avec le timer
End Sub

Private Sub Go_Click() 'On appuie sur le bouton Go
On Error Resume Next
If Ecoute.State = 2 Then 'Si on écoutait, ben on ferme
Ecoute.Close
For i = 1 To Socket.Count - 1 'On décharge tout les sockets
Socket(i).Close
Unload Socket(i) 'On détruit l'objet créer (0 ne peut pas être unloadé)
Next
Else 'Sinon ben on écoute
Ecoute.LocalPort = Port.Text 'Le port
Ecoute.Listen 'On écoute
If Err.Number <> 0 Then 'ERREUR, POURQUOI ON PEUT PAS ÉCOUTER (sûrement que le port est occupé)
MsgBox "Erreur avec le socket! & vbcrlf # " & Err.Number & vbCrLf & Err.Description 'On dit pourquoi
Err.Clear 'On nettoie l'erreur
End If
End If
End Sub

Private Sub send_Click() 'Envoie du message, comme avec le client
recep.Text = recep.Text & "<you> : " & vbCrLf & Emission.Text & vbCrLf & vbCrLf
For i = 1 To Socket.Count - 1
Socket(i).SendData Emission.Text
Next
Emission.Text = ""
End Sub

Private Sub Socket_Close(Index As Integer) 'Le client vient de quitter ou il s'est fait booter
Dim col
For i = 0 To Clients.ListCount - 1 'On cherche son # de socket pour l'enlever de la liste
col = Split(Clients.List(i), ":")
If col(1) = Index Then
Socket(col(1)).Close
Unload Socket(col(1)) 'On kill le socket
recep.Text = recep.Text & recep.Text & "<system> : Connexion terminée avec " & col(0) & " !" & vbCrLf & vbCrLf 'On dit qu'il quitte
Clients.RemoveItem i 'On l'enlève de la liste
Exit For 'Pas besoins de continuer
End If
Next
End Sub

Private Sub Socket_DataArrival(Index As Integer, ByVal bytesTotal As Long) 'Arrivée des données, comme avec le client
Dim data As String
Socket(Index).GetData data, vbString
recep.Text = recep.Text & "<" & Socket(Index).RemoteHostIP & "> : " & vbCrLf & data & vbCrLf & vbCrLf
End Sub

En UDP
-------------
Option Explicit

Private Sub CheckState_Timer()
If Socket.State = 1 Then Go.Caption = "Arrêter" Else: Go.Caption = "Écouter"
End Sub

Private Sub Go_Click()
On Error Resume Next
If Socket.State <> 1 Then
Socket.Close
Socket.Bind port.Text, addr.Text
If Err.Number <> 0 Then 'ERREUR, POURQUOI ON PEUT PAS ÉCOUTER (sûrement que le port est occupé)
MsgBox "Erreur avec le socket! & vbcrlf # " & Err.Number & vbCrLf & Err.Description 'On dit pourquoi
Err.Clear 'On nettoie l'erreur
End If
Else
Socket.Close
End If
End Sub

Private Sub send_Click()
On Error Resume Next
If Socket.State <> 1 Then 'On prend 1 port pour recevoir les messages du recépteur
Socket.LocalPort = 0 'N'IMPORTE QUEL PORT LIBRE
End If
Socket.RemoteHost = sendaddr.Text 'L'adresse où ilo faut envoyer les données
Socket.RemotePort = sendport.Text 'Le port où ilo faut envoyer les données
Socket.SendData Emission.Text 'On envoie (ÇA PEUT BOGUER POUR RIEN!!!)
recep.Text = recep.Text & "<you> : " & vbCrLf & Emission.Text & vbCrLf & vbCrLf 'Pour savoir ce qu'on a envoyer
Emission.Text = "" 'On fait de la place pour un nouveau message
End Sub

Private Sub Socket_DataArrival(ByVal bytesTotal As Long)
Dim data As String
Socket.GetData data, vbString 'On les met dans la variable data
recep.Text = recep.Text & "<" & Socket.RemoteHostIP & "> : " & vbCrLf & data & vbCrLf & vbCrLf 'Pour dire qui à envoyer le message
sendaddr.Text = Socket.RemoteHostIP 'On garde son adresse et on peut lui répondre
sendport.Text = Socket.RemotePort 'On garde son port et on peut lui répondre
Beep
End Sub

Private Sub Socket_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'ERREUR!!! ON AFFICHE L'ERRREUR ET ON FERME LE SOCKET
MsgBox "Erreur avec le socket! & vbcrlf # " & Number & vbCrLf & Description
Socket.Close
End Sub

Conclusion :


Le code, l'exe et surtout la documentation se trouvent à l'adresse suivante :

http://www.frameip.com/vb_mode_tcp_udp/

_SebF

http://www.frameip.com
Un site pour les spécialistes IP

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.