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

Réseau C Discussion :

Connaître son addresse ip pour travailler avec les sockets


Sujet :

Réseau C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Points : 12
    Points
    12
    Par défaut Connaître son addresse ip pour travailler avec les sockets
    Je réalise une application client/serveur et les échanges de types commande/réponse nécessite au reçeveur de connaître l'IP de l'emetteur. En conséquence l'emetteur doit connaître sa propre IP.

    Jusqu'ici j'effectuais des échanges sur deux processus lancé sur la même machine alors pas de problème avec 127.0.0.1 mais lorsque les deux processus tournent sur des machines distantes c'est plus ennuyeux !

    Pouvez-vous m'aider ?

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour,

    tu peux regarder du côté des fonctions gethostname et gethostbyname disponibles dans la winsock si tu travailles sous Windows et dans <netdb.h> et dans <unistd.h> si tu travailles sous Unixoïde.

    La première te donne le nom de la machine, et la seconde renvoie un pointeur sur une structure dans laquelle tu pourras trouver l'adresse IP

    toute la doc sur ces fonctions dans la MSDN ou dans les pages de man

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Connaître son addresse ip pour travailler avec les socke
    Citation Envoyé par canard75
    Je réalise une application client/serveur et les échanges de types commande/réponse nécessite au reçeveur de connaître l'IP de l'emetteur. En conséquence l'emetteur doit connaître sa propre IP.
    Gné ? Pourquoi faire ? Et quel rapport avec le langage C ? Les spécialistes du réseau sont sur le forum "Développement Réseau".
    Jusqu'ici j'effectuais des échanges sur deux processus lancé sur la même machine alors pas de problème avec 127.0.0.1 mais lorsque les deux processus tournent sur des machines distantes c'est plus ennuyeux !
    <Hors Sujet sur le forum C>
    Si tu utilises l'architecture Client/Serveur, UDP ou TCP, peu importe, le client a juste besoin de connaitre l'adresse et le port du serveur, c'est tout. Le serveur se contente d'écouter INADDR_ANY sur le port d'écoute prédéfini.

    La gestion des adresses est automatique.

    On est bien d'accord que, comme il se doit, c'est le client qui pose les questions et le serveur qui répond...

    http://emmanuel-delahaye.developpez.com/reseaux.htm
    </>
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    ET comment cela se passe-t-il qaund ton serveur doit avoir 2, 3 ou encore plus d'adresses IP, on encore s'il y a translation d'adresse quelque part...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Dans l'exemple ci-dessous, le récepteur va bien reçevoir un message en provenance de l'emetteur. Il pourra l'identifier grace à addrInput qui n'est rien d'autre que addrOutput véhiculé à travers la socket. Aussi, l'emetteur doit connaître son IP. Ici il la connais -> 10.192.52.1 car je l'ai spécifié manuellement. Mais comment puis-je le faire automatiquement ?

    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
    // Emetteur qui envoie au récepteur
    strcpy(buffer, "bienvenue au pays des glaces"); 
    inet_aton("10.192.52.1", &(address.sin_addr));
    address.sin_port = htons(2000);
    address.sin_family = AF_INET; 
    sock = socket(AF_INET, SOCK_DGRAM,0); 
    bind(sock, adresse, sizeof(struct sockaddr_in));
    sendto(sock,buffer,length,0,addrOutput,&addrOutput);
     
    // Récepteur qui écoute tout le monde
    inet_aton("0.0.0.0", &(address.sin_addr));
    address.sin_port = htons(2000);
    address.sin_family = AF_INET; 
    sock = socket(AF_INET, SOCK_DGRAM,0); 
    bind(sock, adresse, sizeof(struct sockaddr_in));
    recvfrom(sock,buffer, length,0,addrInput,&addrInputLength);

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par canard75
    Il pourra l'identifier grace à addrInput qui n'est rien d'autre que addrOutput véhiculé à travers la socket. Aussi, l'emetteur doit connaître son IP. Ici il la connais -> 10.192.52.1 car je l'ai spécifié manuellement. Mais comment puis-je le faire automatiquement ?
    Le programme ne peut pas deviner à quel serveur tu veux te connecter... Il faut lui dire d'une façon ou d'une autre.
    • Basiquement : l'adresse IP
    • Symboliquement, avec son nom, à condition que ta machine ait accès à un serveur de nom (DNS, WINS etc.) qui connaisse le nom du serveur et son IP. Dans ce cas, gethostbyname() permet de récupérer l'adresse d'une machine dont on ne connait que le nom.

      C'est plus pratique, mais c'est moins sûr.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Oui je me suis mal expliqué !

    addrOutput c'est l'adresse du récepteur... Ca je peux la définir comme je l'entend, c'est pas le problème.

    mais pour le Bind, il reçois "adresse" qui est l'adresse locale. C'est elle qui permettera au récepteur de connaître l'adresse de l'emetteur !

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le récepteur n'a pas vraiment besoin de connaitre l'adresse de l'émetteur... (puisque l'émetteur est déjà connecté)

    Enfin, ça ce fait avec getpeername(), il me semble (c'est ça ou getsockname())


    Et pour le bind(), le serveur n'a basoin d'aucune adresse: tu peux mettre INADDR_ANY

    Note: Il est rare que le client ait besoin de faire lui-même un bind(). Il ne le fait que dans des cas comme FileZilla, qui permet à l'utilisateur de l'obliger à utiliser certains ports et pas les autres.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2010, 11h06
  2. Réponses: 2
    Dernier message: 15/08/2009, 01h51
  3. Travail avec les int8
    Par VirtualDolby dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/04/2006, 09h33
  4. Réponses: 6
    Dernier message: 19/09/2005, 15h35

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