1 pièce(s) jointe(s)
Connexion TCP/IP via internet
Bonjour à tous
J'ai cherché sur ce forum et bien qu'ayant trouvé certains sujets connexes, je n'ai pas trouvé de réponse précise à mon problème. Et si elle existe, désolé pour le doublon.
Contexte :
J'ai développé une application (un jeu en fait :oops:) sur lequel on peut jouer à deux. Et je cherche à rendre ce mode "deux joueurs" possible via internet. J'ai donc commencer à explorer un domaine qui m'est (presque) totalement inconnu : le réseau. Et après quelque recherches, j'ai choisi le protocole TCP/IP qui me semble plus fiable pour échanger des données.
J'ai donc programmé une petite interface sous VB express 2010 histoire de me faire la main (un mini chat en fait) dont la partie qui nous intéresse ressemble à ça :
Pièce jointe 73568
(désolé, je ne sais pas afficher en taille réelle)
Cette interface gère à la fois l'aspect serveur ou client. En fait, le premier joueur crée un serveur, le second le rejoint, tout deux avec la même application.
Le code source que j'ai simplifié à l'extrême pour plus de clarté est le suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Public Class ConnexionTCPIP
Private ServerSocket As TcpListener
Private ClientSocket As TcpClient
'--------------------------------------------
'Du point de vue "serveur" avec :
'- HostBtn : pushbutton "Héberger"
'- HostIP : textbox associé à "Votre adresse IP"
'- PortNb : textbox associé à "Port de connexion"
'- MsgBox : textbox de communication
Private Sub HostBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HostBtn.Click
ServerSocket = New TcpListener(IPAddress.Parse(HostIP.Text), CInt(PortNb.Text))
ServerSocket.Start()
MsgBox.AppendText("<système> : serveur démarré, en attente d'une connexion client." + vbCrLf)
'Attente d'une connexion "client" :
While Not ServerSocket.Pending
'En réalité, cette boucle est sous forme de "Timer" de manière à conserver la main sur l'interface
End While
ClientSocket = ServerSocket.AcceptTcpClient()
MsgBox.AppendText("<système> : connexion établie." + vbCrLf)
While True
'Là aussi, cette boucle est en fait sous forme de "Timer"
If ClientSocket.Available > 0 Then 'si des données ont été envoyées
'Reception des données envoyées par le "client" :
Dim Stream As NetworkStream = ClientSocket.GetStream()
Dim DataIn(ClientSocket.ReceiveBufferSize) As Byte
Stream.Read(DataIn, 0, ClientSocket.ReceiveBufferSize)
Dim Str As String = System.Text.Encoding.Unicode.GetString(DataIn)
MsgBox.AppendText("<client> : " + Str + vbCrLf)
'Emmission de données vers le "client" :
Dim DataOut As Byte() = System.Text.Encoding.Unicode.GetBytes("Données reçues.")
Stream.Write(DataOut, 0, DataOut.Length)
Stream.Flush()
End if
End While
'Fermeture de connexion
ServerSocket.Stop()
ServerSocket.Server.Close()
End Sub
'--------------------------------------------
'Du point de vue "client" avec :
'- JoinBtn : pushbutton "Rejoindre"
'- JoinIP : textbox associé à "Se connecter sur :"
Private Sub JoinBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles JoinBtn.Click
ClientSocket = New System.Net.Sockets.TcpClient()
Try
ClientSocket.Connect(IPAddress.Parse(JoinIP.Text), CInt(PortNb.Text))
MsgBox.AppendText("<système> : connexion établie." + vbCrLf)
Catch ex As Exception
MsgBox.AppendText("<système> : serveur introuvable." + vbCrLf)
End Try
'Emmission de données vers le "serveur"
Dim Stream As NetworkStream = ClientSocket.GetStream()
Dim DataOut As Byte() = System.Text.Encoding.Unicode.GetBytes("Salut, serveur !")
Stream.Write(DataOut, 0, DataOut.Length) 'envoi des données
Stream.Flush()
'Reception des données envoyées par le "serveur" :
While True
'Là aussi, cette boucle est en fait sous forme de "Timer"
If ClientSocket.Available > 0 Then 'si des données ont été envoyées
Dim DataIn(ClientSocket.ReceiveBufferSize) As Byte
Stream.Read(DataIn, 0, ClientSocket.ReceiveBufferSize) 'lecture des données
Dim Str As String = System.Text.Encoding.Unicode.GetString(DataIn)
MsgBox.AppendText("<serveur> : " + Str + vbCrLf)
End if
End While
'Fermeture de connexion
ClientSocket.Close()
End sub
End Class |
J'ai testé ce programme sur un réseau local avec les adresses IP visible dans l'image de l'interface : il fonctionne très bien.
C'est lorsque j'ai voulu le tester sur internet que les problèmes ont commencé. Déjà, à cause des nombreuses adresses IP que mon ordinateur possède... et aussi à cause de mon ignorance sur le domaine réseau.
En fouinant un peu dans ma livebox, voilà les adresse IP que j'ai trouvé :
Adresse IP WAN : 90.22.83.152 (ça, c'est mon adresse IP internet)
Adresse IP du BAS : 193.253.160.3 (c'est quoi donc ?)
Serveur DNS primaire : 81.253.149.1 (à quoi ça sert ?)
Serveur DNS secondaire : 80.10.246.3 (à quoi ça sert ?)
Adresse IP du LAN : 192.168.1.1 (adresse IP de ma livebox, je suppose...)
Mais ce n'est pas tout, il y a une autre adresse IP que mon application détecte automatiquement via le code ci-dessous :
Code:
1 2 3 4
| Dim ips() As IPAddress = Dns.GetHostAddresses(Dns.GetHostName)
For Each ipa As IPAddress In ips
lbluser.Text = ipa.ToString + Environment.NewLine
Next |
Cette adresse est la suivante : 192.168.1.123
Je suppose qu'il s'agit de l'adresse de mon PC sur le réseau local car elle correspond à celle que donne la commande MSDos Ipconfig.
Et maintenant, les résultats de mes tests :
Pour l'instant, j'ai testé mon application uniquement à partir de mon ordinateur (je ne sais d'ailleurs pas si cette démarche est valide). Dans chacun des cas, il va de soit que le numéro de port est identique côté serveur et côté client.
Test 1 :
Serveur déclaré en : 192.168.1.123 (IP local du PC)
Client se connecte sur : 192.168.1.123 (IP local du PC)
Ça marche ! (idem pour 2 PC sur un réseau local avec leurs adresses IP respectives)
Tests 2 :
Serveur déclaré en :
- 90.22.83.152 (IP internet)
- 193.253.160.3 (IP du BAS, j'ignore ce que c'est)
Échec de la création du serveur avec le message d'erreur suivant :
"L'adresse demandée n'est pas valide dans son contexte"
Il plante sur l'instruction :
ServerSocket.Start()
Test 3 :
Serveur déclaré en : 192.168.1.123 (IP local du PC)
Client se connecte sur :
- 90.22.83.152 (IP internet)
- 193.253.160.3 (IP du BAS, j'ignore ce que c'est)
Pas de plantage de l'application (grâce à "try"), mais visiblement la connexion ne veut pas s'établir. En fait, cela planterait sur l'instruction :
ClientSocket.Connect(IPAddress.Parse(JoinIP.Text), CInt(PortNb.Text))
Mes questions sont multiples :
- Puis-je effectuer mes tests depuis mon PC seul ? Est-ce que cette démarche est valide ?
- Quelles adresses IP il faudrait mettre pour que cela ait une chance de fonctionner ?
- Est-ce que ce code source peut fonctionner via internet, ou bien faut-il utiliser d'autres commandes ou un autre protocole ?
Désolé pour ce long message, mais je tenais à être le plus précis possible.
Enfin, avant que l'on me pose la question : oui, j'ai autorisé mon pare-feu à laisser causer mon application sur internet.
Merci d'avance pour vos lumières.