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

Qt Discussion :

[Qt 4.4.3] QtNetwork - QTcpServer : Comment connaître son adresse sur le réseau local


Sujet :

Qt

  1. #1
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut [Qt 4.4.3] QtNetwork - QTcpServer : Comment connaître son adresse sur le réseau local
    Bonjour,
    bien que mon titre soit plutôt explicite, je voudrais savoir comment je fais pour connaître l'adresse IP de ma machine dans mon réseau local ?

    J'ai un test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    txtLog->append("Le server est lancé sur le port à l'adresse : " +
    server->serverAddress().toString() +
    " au port : " + QString::number(server->serverPort()));
    sauf que mon adresse IP est toujours 0.0.0.0

    doc de QTcpServer
    doc de QHostAddress

    Y'a quelque chose qui a dû m'échapper
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  2. #2
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    0.0.0.0 correspond à QHostAddress::Any, donc tu as lancé une écoute sur toutes les interfaces de la machine par listen(). Et dans ce cas là il n'a pas de raison de choisir une adresse plutôt qu'une autre.
    Si tu veux écouter sur une seule adresse il faut la connaître avant, pour la passer au listen().

  3. #3
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    Ok, donc lorsqu'un client sera connecté, je crée un nouveau QTcpSocket *, et de là, est-ce que je peux avoir mon IP ?

    Je viens de tester de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void test::newClientConnected()
    {
         QTcpSocket *newClient = server->nextPendingConnection();
         txtLog->append("Nouveau client connecté : " + newClient->localAddress().toString())
    }
    Cette fois, je me retrouve avec mon adresse localhost 127.0.0.1.

    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool QTcpServer::listen ( const QHostAddress & address = QHostAddress::Any, quint16 port = 0 )
    le premier paramètre est l'adresse d'une de MES interfaces, ou une adresse d'une interface d'un autre ordinateur ?
    si c'est bien d'une de mes interfaces (ce que je pense), cela veut dire que je dois au préalable faire un ipconfig pour savoir quelle est l'IP qui m'intéresse ? Y'a vraiment aucun moyen direct de savoir quelle est mon IP vue de l'exterieur (mais de mon réseau local). Il doit bien y avoir une fonction systeme ou un truc dans le genre ?

    Autre question pendant que j'y suis : Admettons que je veuille filtrer les IP des ordis qui se connectent à mon serveur, comment je m'y prends ? est-ce que je dois accepter la connexion, creer le QTcpSocket et regarder son PeerAddress() pour ensuite savoir si je le jette ?
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  4. #4
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Oui une fois que tu as un socket tu sais quelles sont les ips (et ports) utilisés pour ce socket, avec les fonctions qui vont bien que tu as citées. Si tu obtiens l'adresse localhost pour le serveur c'est parce que le client s'est connecté par localhost.

    Dans le listen il faut bien une adresse de la machine du serveur. Et ce n'est pas évident en soi de connaître "l'ip extérieure la machine", car il peut y avoir plusieurs cartes et plusieurs adresses par carte (surtout en ipv6).
    je ne crois pas que Qt puisse récupérer la liste des interfaces de la machine. Mais c'est sur qu'il y a des fonctions systèmes pour le faire (pas forcément portables). Personnellement j'avais utilisé la libpcap pour le faire (à peu près de la même manière que le fait wireshark), mais je faisais aussi de la capture à côté donc le choix était pertinent. Y a peut-être d'autres trucs plus ou moins portables qui font ça aussi, (voir directement les appels systèmes).
    En tout cas même avec la liste faut faire un choix derrière.

    Pour le filtrage, oui ça se fait qu'une fois le socket connecté. Mais c'est normal, vu que les applications sont dans une couche plus élevée que TCP. L'appli n'est pas vraiment censée voir ce qui se passe en dessous, juste recevoir un flux de données.

  5. #5
    Membre averti Avatar de MacPro
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 367
    Points : 344
    Points
    344
    Par défaut
    OK, bon je marque en résolu alors. je 'dérésolverai' si ça marche toujours pas.
    Lorsque vous avez trouvé solution à votre problème, n'oubliez pas de cliquer en bas de la page
    Besoin d'un photographe de mariage : http://www.triangle-photo.fr

  6. #6
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par kinji1 Voir le message
    je ne crois pas que Qt puisse récupérer la liste des interfaces de la machine.
    Erreur, il y a un moyen : depuis Qt 4.2, QNetworkInterface sera ton ami pour récupérer la liste de toutes les interfaces réseau de ton ordinateur et leurs adresses IP associées.

    Ca marchera à tous les coups pour un réseau local.

    Mais attention: si ton ordinateur est connecté à un NAT qui lui-même est connecté à internet (typiquement le NAT en question est une Freebox/NeufBox/LiveBox), dans ce cas tu n'as aucun moyen avec cette interface là de connaître ton adresse IP publique (ie. ton adresse vue depuis internet).

    Dans le cas ci-dessus (ie. connaître son adresse IP publique), il faut passer par un autre moyen. Typiquement, utiliser QHttp pour charger une page HTML qui affiche ton IP vu d'un serveur extérieur (genre whatsmyip.com), récupérer le résultat (la page HTML) et y extraire la chaîne de caractères représentant ton adresse IP publique.
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  7. #7
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Citation Envoyé par nouknouk Voir le message
    Erreur, il y a un moyen : depuis Qt 4.2, QNetworkInterface sera ton ami pour récupérer la liste de toutes les interfaces réseau de ton ordinateur et leurs adresses IP associées.
    Trop bien, merci, je ne savais pas qu'ils avaient rajouté ça.

    Citation Envoyé par nouknouk Voir le message
    Typiquement, utiliser QHttp pour charger une page HTML qui affiche ton IP vu d'un serveur extérieur (genre whatsmyip.com), récupérer le résultat (la page HTML) et y extraire la chaîne de caractères représentant ton adresse IP publique.
    Certaines boxes gèrent aussi l'upnp et il est possible de l'ip récupérer externe de la box comme ça, mais c'est une méthode beaucoup plus complliquée.

Discussions similaires

  1. [Débutant] comment mettre mon application sur un réseau local?
    Par spring.time dans le forum VB.NET
    Réponses: 0
    Dernier message: 20/09/2012, 11h40
  2. Comment connaître l'adresse ftp:// et l'afficher dans un texte?
    Par xXO--Hades--OXx dans le forum Android
    Réponses: 7
    Dernier message: 11/05/2012, 13h57
  3. Comment connaître son uid
    Par Yokho dans le forum Général Python
    Réponses: 1
    Dernier message: 15/02/2008, 04h09
  4. Réponses: 2
    Dernier message: 10/04/2006, 13h08
  5. Comment connaître son IP derrière un routeur ?
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 22/02/2004, 18h24

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