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 Discussion :

Récupérer Adresse IP Réseau avec les sockets [FAQ]


Sujet :

Réseau

  1. #1
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut Récupérer Adresse IP Réseau avec les sockets
    Bonjour,
    je cherche a récupérer mon adresse IP du point de vue de mon réseau....
    Je voudrais obtenir, par exemple, 192.168.0.x et non 127.0.0.1

    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
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <netdb.h>
     
    void view_ip()
    {
     char s[256];
       struct hostent *host;
       struct in_addr **adr;
     
       if (!gethostname(s, 256))
         if ((host = gethostbyname(s)) != NULL)
          for (adr = (struct in_addr **)host->h_addr_list; *adr; adr++)
               printf("IP : %s\n", inet_ntoa(**adr));
     }
    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  2. #2
    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
    Par défaut
    Salut
    ça ressemble pas à la réponse que l'on peut trouver ici: http://c.developpez.com/faq/c/?page=reseau#RESEAUX_nom?

  3. #3
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Oui, c'est bien cette réponse :-), ce qui donne le code que j'ai donné dans mon précédent post et qui ne fonctionne pas
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  4. #4
    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
    Par défaut
    Citation Envoyé par SteelBox
    Oui, c'est bien cette réponse :-), ce qui donne le code que j'ai donné dans mon précédent post et qui ne fonctionne pas
    Ben oui t'as raison je me disais aussi...
    mmm tu as bien la liste de tes adresses en fait je me demande ce que contient franchement ce code m'a l'air juste à première vue. Peux tu donner le complet que j'essaie de le compiler sur ma machine. Car:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    root@asgard# gcc -Wall -ansi faqrres.c -o faqrres
    root@asgard# chmod +x faqrres
    root@asgard# ./faqrres 
    IP : 212.30.113.197
    Donc la
    Je suis sous FreeBSD 6.0 et mon gcc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $gcc -v
    Using built-in specs.
    Configured with: FreeBSD/amd64 system compiler
    Thread model: posix
    gcc version 3.4.4 [FreeBSD] 20050518
    A titre informatif j'ai juste rajouté un main avec la fonction...Et je suppose que cette IP est la bonne (je suis pas en IP fixe) mais si tu veux je peux demander à un admin de confirmer (ou pas d'ailleurs!)

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    pour que cela fonctionne il faut que :
    ton nom de hosts soit existant (il l'est tres probablement) --> commande hostname.
    que le fichier /etc/hosts contienne l'adresse et le hostname
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par MarcG
    pour que cela fonctionne il faut que :
    ton nom de hosts soit existant (il l'est tres probablement) --> commande hostname.
    que le fichier /etc/hosts contienne l'adresse et le hostname
    Salut,
    J'ai le même problème...
    Voici mon fichier /etc/hosts
    [Toma@tux Serveur]$ cat /etc/hosts
    # Do not remove the following line, or various programs
    # that require network functionality will fail.
    127.0.0.1 tux.plinac tux
    C'est donc pour moi impossible de récupérer l'ip internet ?

    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    pas de cette facon la en tout cas, puisque tu utilise la fonction gethostbyname(s) tu recherche dans le DNS ou le fichier hosts.
    il faudrait que tu mette ajour ton fichier host si tu n'as pas de nom sur DNS
    si tu es en dhcp (donc adresse qui change a chaque demarage' tu peut faire un script qui apres chaque demarrage et affectation d'IP te met a jour ce fichiers , du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo -e "$(/sbin/ifconfig|grep 'inet adr' | grep -v '127.0.0.1'| cut -d':' -f 2|cut -d' ' -f1)\t $(hostname)" >> /etc/hosts
    il faut toutefois que tu enleve le nom deja present en face du 127.0.0.1 et le remplace par localhost (ATTENTION a cause du serveur X il n'est pas rare qu'il faille rebooter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    127.0.0.1    localhost
    meintenent pourquoi veut tu cette adresse ?
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  8. #8
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par MarcG
    meintenent pourquoi veut tu cette adresse ?
    Je réalise une appli serveur-client, le serveur sera sur mon PC et le client sur un autre.
    Donc j'ai besoin de récupérer l'ip de mon PC pour faire un blind() de la socket client dessus, pour qu'ainsi le client puisse se connecter avec le serveur.

    J'espere avoir été un claire
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    la c'est plutot le forum C .... un bind (et pas blind) ne demande pas d'adresse IP mais un n° de port ..... enfin une structure dessus ...
    voici un petit exemple :
    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
     
    int
    sim_creat_serv (char *nom, int *sock)
    {
    /* nom = le nom d'un services declarer dans /etc/services */
    */ sock pointer sur le descripteur socket */
      int cr;
      struct sockaddr_in adr;
      struct servent *pService;
     
      cr = 0;
     
      /* creation d'une socket */
      *sock = socket (AF_INET, SOCK_STREAM, 0);
      if (*sock == -1)
        {
          perror ("erreur socket dans creat_serv");
          cr = errno;
        }
      else
        {
          /* recherche du numero de port */
          pService = getservbyname (nom, "tcp");
     
          /* attachement de la socket */
          adr.sin_family = AF_INET;
          adr.sin_addr.s_addr = INADDR_ANY;
          adr.sin_port = pService->s_port;
          printf ("====>port %d en attente de connect\n", htons (adr.sin_port));
          fflush (stdout);
     
          if (bind (*sock, (struct sockaddr *) &adr, sizeof (adr)) == -1)
    	{
    	  perror ("erreur bind dans creat_serv");
    	  cr = errno;
    	}
          else
    	{
    	  if (listen (*sock, 1) == -1)
    	    {
    	      perror ("erreur listen dans creat_serv");
    	      cr = errno;
    	    }
    	}
        }
      return (cr);
    }
    Voila si cela peut t'avancer
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  10. #10
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Quand un client veut se connecter sur un serveur (qui n'est pas sur une machine dans son réseau), il doit bien fournir une ip quelque part
    Je pense que c'est dans la structure que l'on donne à bind()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct sockaddr_in serv;
    serv.sin_family = AF_INET;
    serv.sin_port = htons(80);    // port 80
    serv.sin_addr.s_addr = inet_addr("127.0.0.1");  // et ici on passe l'ip
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    non pour un serveur tu ne passe rien .... tu colle juste cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    adr.sin_addr.s_addr = INADDR_ANY;
    un serveur demarre puis se met à l'écoute d'un port (udp ou tcp) puis plus rien (y s'occupe pas de l'adresse puisqu'il ne contact personne)..... jusqu'a un client qui se connecte qui lui doit bien evidemment connaitre l'IP + le port, la il est possible au serveur de recuperer l'adresse du client.
    ensuite le serveur (souvent) "fork" afin d'etablir la connection sur une autre instance, le pere reste en ecoute ...
    dans le cas d'une question (cleint)->reponse (serveur) et deconnection pas besoin de forker.
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  12. #12
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ok en effet si j'avais reflechi un peu, j'aurais deviner qu'un serveur n'a pas besoin d'une ip..

    Comment connaitre mon ip pour pouvoir faire un test ? c'est à dire la coller dans un client..

    j'ai essayer :
    ifconfig
    Mais il ne me donne que l'ip locale
    [root@tux sbin]# ifconfig
    eth0 Link encap:Ethernet HWaddr 00:0B:CD:A7:93:77
    inet adr:192.168.0.31 Bcast:192.168.0.255 Masque:255.255.255.0
    adr inet6: fe80::20b:cdff:fea7:9377/64 Scope:Lien
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:32057 errors:0 dropped:0 overruns:0 frame:0
    TX packets:28417 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 lg file transmission:1000
    RX bytes:32444111 (30.9 MiB) TX bytes:3800145 (3.6 MiB)
    Interruption:10 Adresse de base:0xc000

    lo Link encap:Boucle locale
    inet adr:127.0.0.1 Masque:255.0.0.0
    adr inet6: ::1/128 Scope:Hôte
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:1648 errors:0 dropped:0 overruns:0 frame:0
    TX packets:1648 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 lg file transmission:0
    RX bytes:1951173 (1.8 MiB) TX bytes:1951173 (1.8 MiB)
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  13. #13
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Quand j'ai rencontré le besoin de récupérer mon adresse ip internet, 2 solutions se sont présentées à moi :

    utiliser wget et aller sur un site internet qui te donne ton ip
    genre : http://www.whatismyip.com/
    ensuite, il faut parcourir la page html, et isoler ce qui t'intéresse.

    Ou

    toujours utiliser wget mais vers le routeur : Celui ci avait une interface web.
    Même système, on parse la page html pour ne récupérer que ce qui nous intéresse.

    Le problème avec cette méthode, c'est que cela crée de fortes dépendances:
    • méthode 1
      [list:13bdca5086]wget
      le site internet

    méthode 2
    • toujours wget
      le routeur
    [/list:u:13bdca5086]

    Et puis ça n'est pas très portable comme solution.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  14. #14
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Arf..pour une fois windows gagne...c'est beaucoup plus simple
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  15. #15
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Mon PC etant en reseau avec un autre sous XP, j'ai pu avoir mon ip en faisant un simple ipconfig sur l'autre machine.
    Je teste donc en essayant de connecter mon client sur le serveur..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /*...*/
    int err;
    struct sockaddr_in sout;
    sout.sin_family = AF_INET;
    sout.sin_addr.s_addr = inet_addr("83.192.xxx.xxx");
    err = connect(pMesDonnees->maSocket,(struct sockaddr *) &sout, sizeof(sout));
    if ( err != 0 )
    {
       perror("connect()");
    }
    /*...*/
    Malheureusement, connect sort en erreur...
    Connect(): Connexion refusée
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  16. #16
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Je n'ai pas posté dans le forum C car je pense que le code est bon...cela doit venir d'autre part..peut etre que linux empeche la connection (j'ai lancé les 2 programmes en simple user, je vais essayer en root).
    Je precise que je suis sous Fedora4.
    Peut etrre est-ce le firewall ou SELinux qui empeche la connection, je ne sais pas, je ne m'y connais pas encore des masses
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  17. #17
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    La méthode wget est un peu bourrin quand même. Je trouve ca étrange que Linux ne stocke pas l'adresse ip dans un fichier, c'est quand même une habitude de stocker les paramètres importants dans des fichiers
    En plus, je voudrais éviter de faire appel à des commandes du shell. Je préférerais éventuellement utiliser une lib supplémentaire dans mon code.

    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  18. #18
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    Linux (pas plus que windows) ne stocke une adresse donnée via DHCP dans un fichier puisque cette adresse est dynamique .....
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  19. #19
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Donc, pas d'autres solutions que wget ? et ifconfig, il fait comment exactement ?
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  20. #20
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Moi je suis derrière un modem/routeur donc mon linux ne stockera pas mon adresse IP_FAI en mémoire. Par contre, j'en avais besoin aussi et je me demande si j'avais pas posté une question à l'époque. Ceci dit, moi j'ai automatisé la récupération de mon IP_FAI avec un simple script bash.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/sh
    #
    cd ./
     
    rm index.html 2>/dev/null
    wget http://checkip.dyndns.org/ >/dev/null 2>/dev/null
    myip=$(cat ./index.html | sed -e 's/[^.0-9]//g')
    echo "Your IP : "$myip
    exit
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

Discussions similaires

  1. Réponses: 20
    Dernier message: 28/02/2009, 15h58
  2. Réponses: 2
    Dernier message: 05/11/2008, 10h36
  3. pb adresse ip dynamique autrement qu'avec ping
    Par pcouas dans le forum Administration système
    Réponses: 3
    Dernier message: 08/08/2008, 09h27
  4. Problème avec les contacts et le carnet d'adresse
    Par ricain59 dans le forum Outlook
    Réponses: 11
    Dernier message: 13/11/2007, 20h44
  5. adresser une base de données avec un fichier vbscript
    Par boss_gama dans le forum VBScript
    Réponses: 8
    Dernier message: 16/08/2006, 19h19

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