IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Connexion TCP/IP via internet


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 20
    Par défaut 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 ) 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 :

    Nom : interface.jpg
Affichages : 2281
Taille : 7,7 Ko
    (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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre expérimenté Avatar de anonymousse
    Profil pro
    Inscrit en
    Février 2011
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 130
    Par défaut
    bonsoir,

    as-tu lu cette discussion ?

    http://forum.telecharger.01net.com/m...essages-1.html

  3. #3
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut
    L'adresse BAS concerne des équipements propre au FAI, cela ne te concerne pas.

    Pour résumer
    Ton pc à une adresse IP sur le réseau local : 192.168.1.123 probablement
    Ta livebox à 2 adresses, une sur le réseau local : 192.168.1.1, une sur le réseau internet : 90.22.83.152.

    Les serveurs DNS sont les serveurs qui sont interrogés pour faire la correspondance entre une adresse web style http://..... et l'adresse ip correspondante.

    Pour ce qui est des connections, si tu te connecte à ton pc depuis ton pc (même adresse ip), normalement ta connexion ne passe même pas par le réseau local, elle est court-circuitée par la carte réseau qui le reboucle sur elle-même (ça revient à utiliser l'adresse de bouclage 127.0.0.1)

    Si tu essaye d'utiliser ton adresse internet depuis ton pc, ça va dépendre de ton matériel, mais il y a de forte chance que ça marche pas. Suivant les box, soit elle va détecter l'adresse demandée correspond à elle-même et va reboucler en local sans passer par Internet, soit elle va envoyer le paquet sur internet, qui va lui revenir et elle le transmettra en local, soit, et c'est la plupart des cas, elle va envoyer le paquet sur internet, qui va lui revenir et elle va le bloquer car un paquet qui à pour source l'adresse de destination peut être synonyme d'une tentative d'attaque.

    Donc pour faire tes tests, il vaudrait mieux mettre une des 2 applis sur une autre machine sur une autre connexion internet (voisin, copain, ou alors essayer de passer par un proxy anonymisant)

  4. #4
    Membre éprouvé Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Par défaut
    bonsoir

    Il suffit de débloquer le port sur ta livebox

    tu lui indique sur quelle IP (ton PC) tu veux que le port soit adressé

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 20
    Par défaut
    Merci anonumousse pour ton lien assez instructif... même si j'ai encore un peu de mal à m'y retrouver là-dedans, mais c'est déjà un peu plus clair.

    Merci sevyc64 pour tes éclaircissements.

    Pour être sûr que j'ai bien compris et pour en revenir au cas qui m'intéresse, normalement je devrais :
    - Côté serveur, déclarer mon serveur depuis mon adresse IP du reseau local (192.168.1.123 dans mon exemple) (...et puis d'ailleurs, il n'y a que ça qui marche. Lorsque je tente de créer le serveur depuis d'autres adresses, il me dit : "L'adresse demandée n'est pas valide dans son contexte")
    - Côté client, rejoindre l'adresse IP internet associée au serveur (90.22.83.152 dans mon exemple)

    Vous confirmez ?


    Reste le problème du port. D'après Anklor (que je remercie également pour son intervention), il faudrait débloquer un port dans ma livebox. Déjà, je ne suis pas sûr de savoir le faire (et j'imagine que c'est encore moins le cas pour le joueur en face), et par ailleurs, je trouve cela très contraignant. Pourtant, j'ai tout un tas d'applications qui fonctionne sur internet et qui, je suppose, ne vont pas fouiner dans ma livebox pour débloquer les ports, non ? Alors comment font ces applications ? Existe-t-il une commande sous VB permettant le déblocage d'un port ? Ou bien le choix d'un port déjà ouvert (ce qui serait quand même assez contraignant, car rien ne dit que mes ports ouverts correspondent à ceux du joueur d'en face) ?

    Ah, j'ai également une question annexe (désolé, ça fait beaucoup de questions). Existe-t-il un moyen de réccupérer sous VB l'adresse IP internet se son PC ? Et si oui, comment ?

    Merci d'avance pour vos lumières.

  6. #6
    Membre éprouvé Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Par défaut
    Salut,
    c'est normal, tes applications qui fonctionnent sur internet ne font pas office de serveur .
    débloquer un port signifie que le client (qui donnera le numéro IP ADSL de ton domicile ou se trouve le serveur) serait automatiquement dirigé sur ton IP local.
    Il n'y a pas d'autre moyen de contourner le problème.
    Malheureusement je ne suis pas chez orange et ne peux donc t'aider pour débloquer le port mais je suis sûr qu'il y a plein de tuto sur internet

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut
    Citation Envoyé par kwaz73 Voir le message
    - Côté serveur, déclarer mon serveur depuis mon adresse IP du reseau local (192.168.1.123 dans mon exemple) (...et puis d'ailleurs, il n'y a que ça qui marche. Lorsque je tente de créer le serveur depuis d'autres adresses, il me dit : "L'adresse demandée n'est pas valide dans son contexte")
    Oui.
    De toute façon coté serveur ça sera toujours l'adresse locale, donc l'adresse de ton poste ou même mieux 127.0.0.1, comme ça tu pourra mettre ton serevur sur un autre poste sans avoir à redéfinir l'adresse.

    - Côté client, rejoindre l'adresse IP internet associée au serveur (90.22.83.152 dans mon exemple)
    Oui, aussi, mais .....

    Reste le problème du port. D'après Anklor (que je remercie également pour son intervention), il faudrait débloquer un port dans ma livebox.
    ... il faut configurer la Livebox pour lui dire que "tout ce qui vient d'internet sur ce port, doit être redirigé sur le réseau local sur cette adresse ip et ce port"
    C'est ce qu'on appelle configurer le NAT de la box
    Le port d'arrivée c'est le port que le client va interrogé, l'adresse ip de redirection c'est celle de ton serveur sur le réseau local, le port de redirection c'est le port sur lequel ton serveur attend la connexion (qui est normalement le même que celui d'arrivé, mais c'est pas une obligation)



    je trouve cela très contraignant. Pourtant, j'ai tout un tas d'applications qui fonctionne sur internet et qui, je suppose, ne vont pas fouiner dans ma livebox pour débloquer les ports, non ? Alors comment font ces applications ? Existe-t-il une commande sous VB permettant le déblocage d'un port ? Ou bien le choix d'un port déjà ouvert (ce qui serait quand même assez contraignant, car rien ne dit que mes ports ouverts correspondent à ceux du joueur d'en face) ?
    Mais tes applications ne sont pas des serveurs, c'est des clients. Donc elles peuvent sortir vers internet sans avoir forcément besoin d'ouvrir de port particuliers.
    Par contre c'est le trafic arrivant depuis internet et donc à destination d'un serveur local qui a besoin d'être autorisé car sinon il est bloqué par la box (et/ou le parefeu).

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 20
    Par défaut
    Citation Envoyé par sevyc64 Voir le message
    Mais tes applications ne sont pas des serveurs, c'est des clients.
    Je n'en suis pas si sûr. Je me souviens (si ma mémoire est bonne) de certains jeux qui proposaient :
    - Une connexion via un serveur dédié (ce n'est pas ce qui nous intéresse ici)
    - Une connexion directe TCP/IP

    Dans ce dernier cas, deux possibilités (suivant le jeu) :
    Cas 1 :
    - L'hôte démarrait un serveur sans avoir besoin de renseigner quoique ce soit
    - Les clients se connectaient sur l'adresse IP internet de l'hôte
    Mais là, je ne comprends pas trop comment le port était choisi
    Cas 2 :
    - L'hôte démarrait un serveur en précisant le numéro de port
    - Les clients se connectaient sur l'adresse IP internet de l'hôte en renseignant le même numéro de port.
    ...et il n'y avait pas de problème de déblocage de port dans la box.

    Bon, avant de poursuivre, je devrais peut-être tester ça en situation réelle, maintenant que j'ai les bonnes infos. Je fait cela ce soir et je vous tiens au courrant.

    Sinon, je pense avoir trouvé la réponse à ma question annexe :
    Citation Envoyé par kwaz73 Voir le message
    Ah, j'ai également une question annexe (désolé, ça fait beaucoup de questions). Existe-t-il un moyen de réccupérer sous VB l'adresse IP internet se son PC ? Et si oui, comment ?
    Malheureusement, il semblerait qu'il n'existe aucun moyen "interne" de réccupérer son IP internet. Soit il faut passer par un site qui donne notre IP, soit il faut s'envoyer un mail.
    ...dommage.

  9. #9
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 251
    Par défaut
    Tout dépend aussi i ta box est en mode routeur ou en mode modem.

    En mode modem c'est comme si ton pc était directement connecté à internet.

    Tel que tu nous as décrits ton réseau, tu dois être en mode routeur.


    A noter que le problème de port se pose pour la box, mais aussi pour les divers parefeux éventuellement en fonctionnement sur les machines.

  10. #10
    Membre éprouvé Avatar de Anklor
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 76
    Par défaut
    Je confirmes, la DMZ est à utiliser qu'au dernier recours, de + cela ne permet plus aux autres PCs connectés au réseau de pouvoir bénéficier d'un port.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/02/2008, 23h23
  2. bloquage d'une tentative de connexion via internet
    Par noussaENSI dans le forum Développement
    Réponses: 12
    Dernier message: 17/07/2006, 13h09
  3. connexion via internet
    Par nah_wah dans le forum Apache
    Réponses: 11
    Dernier message: 04/10/2005, 11h01
  4. Connexion a un bd via internet
    Par toure32 dans le forum Bases de données
    Réponses: 4
    Dernier message: 24/07/2004, 19h33
  5. Connexion à une base SQL_Serve via Internet
    Par Yoann_D dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 22/07/2003, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo