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

 C Discussion :

récupérer dans un tableau IP[4] l adresse IP


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Par défaut récupérer dans un tableau IP[4] l adresse IP
    bonjour ! c est surement simple comme la lune, mais je n arrive pas à extirper de mon string l'adresse IP de ma machine en un tableau en 4 char

    le string est bien sur la copie de inet_ntoa(sin.sin_adr)

    n y a t il pas une fonction C sous Win ( ou mingw) qui permette simplement de recuperer ce tableau la ?

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour,

    Pas tout compris, mais si tu veux spiter une ip du style 1.2.3.4 en 4 en considerant le point comme separateur il y a la fonction strtok.
    sinon l utilisation de sscanf( ip, "%s.%s.%s.%s", c1,c2,c3,c4 ); doit aussi le faire

    bon courage et bon week end.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par karistouf Voir le message
    bonjour ! c est surement simple comme la lune, mais je n arrive pas à extirper de mon string l'adresse IP de ma machine en un tableau en 4 char

    le string est bien sur la copie de inet_ntoa(sin.sin_adr)

    n y a t il pas une fonction C sous Win ( ou mingw) qui permette simplement de recuperer ce tableau la ?
    http://emmanuel-delahaye.developpez.com/clib.htm
    module IPV4

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Par défaut
    woa... rapide !
    merci de vos réponses !
    [je me pencherais bientot sur cette bibliotheque c est promis, mais pour l instant je ne preferes pas rajouter le biblio en +]

    ok, j ai surement un souci à deux souscar j ai vraiment bp de mal avec les caracteres et la gestion des strings

    sscanf> je ne m en depatouille pas, je suis sous mingw et dev cpp.
    bizarrement, je n arrives qu a afficher 1 seule identité avec point.

    Je desires en fait , à partir de 192.168.1.189 par ex obtenir un tableau char ip[4] :
    ip[0]=192
    ip[1]=168

    voilà! des idées ?

    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
     
    //variables globales
    char string_ip[30];
    char my_ip_is[4];//report pour artnet poll reply
    int sinsize;
    SOCKET sock;
    SOCKADDR_IN sin;
    struct hostent * phe;
    char FAR hostnamebuffer[64] ;
    char broadcast='1';
    int nbrbytessended=0;
    int nbrbyterecv=0;
     
    int init_client()
    {
    WSADATA wsa;
    WSAStartup(MAKEWORD(2,0),&wsa);
     
    //adresse locale et nom de machine
     gethostname(hostnamebuffer, sizeof(hostnamebuffer));
     phe = gethostbyname(hostnamebuffer);
     int Ipsearch = 0;
     while((phe->h_addr_list[Ipsearch+1])!=NULL)
     {Ipsearch++;}
     memcpy(&sin.sin_addr.s_addr, phe->h_addr_list[Ipsearch], phe->h_length);
     sprintf(string_ip,inet_ntoa(sin.sin_addr));
     //extraction en tableau de 4 char
     
    //sscanf(string_ip,"%s.%s.%s.%s", my_ip_is[0],my_ip_is[1],my_ip_is[2],my_ip_is[3]);         
    sscanf(string_ip,"%d.%s.%s.%s", my_ip_is,my_ip_is+1,my_ip_is+2,my_ip_is+3);   
     
     
    cout<<"\n["<<my_ip_is[0]<<my_ip_is[1]<<my_ip_is[2]<<my_ip_is[3]<< " ]";
    // et patit et patata
    return(0);
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par karistouf Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cout<<"\n["<<my_ip_is[0]<<my_ip_is[1]<<my_ip_is[2]<<my_ip_is[3]<< " ]";
    // et patit et patata
    return(0);
    }
    Attention, ici, on parle le C. Pour le C++, c'est à-coté. Je déplace ?

    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int my_ip_is[4];                //report pour artnet poll reply
    <...>
       sscanf (string_ip, "%d.%d.%d.%d", my_ip_is, my_ip_is + 1, my_ip_is + 2,
               my_ip_is + 3);
     
       printf ("%d.%d.%d.%d\n", my_ip_is[0], my_ip_is[1], my_ip_is[2],
               my_ip_is[3]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    192.168.0.3
     
    Process returned 0 (0x0)   execution time : 0.098 s
    Press any key to continue.
    Toutes ces globales me donnent la chair de poule...
    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
     
    #if defined (WIN32) || defined (_WIN32)
     
    #include <winsock2.h>
     
    #elif defined (linux) || defined (_POSIX_VERSION) || defined (_POSIX2_C_VERSION)\
     || defined (_XOPEN_VERSION)
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>             /* close */
     
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
     
    #define closesocket(s) close (s)
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    #else
    #error not defined for this platform
    #endif
     
    int init_client (void)
    {
       WSADATA wsa;
       WSAStartup (MAKEWORD (2, 0), &wsa);
     
       char hostnamebuffer[64];
     
    //adresse locale et nom de machine
       gethostname (hostnamebuffer, sizeof (hostnamebuffer));
       struct hostent *phe = gethostbyname (hostnamebuffer);
       if (phe != NULL)
       {
          int Ipsearch = 0;
          while ((phe->h_addr_list[Ipsearch + 1]) != NULL)
          {
             Ipsearch++;
          }
          {
             SOCKADDR_IN s_in;
     
             memcpy (&s_in.sin_addr.s_addr, phe->h_addr_list[Ipsearch],
                     phe->h_length);
     
             char string_ip[30];
             {
                sprintf (string_ip, inet_ntoa (s_in.sin_addr));
                //extraction en tableau de 4 char
                {
                   int my_ip_is[4]; //report pour artnet poll reply
                   sscanf (string_ip, "%d.%d.%d.%d", my_ip_is, my_ip_is + 1,
                           my_ip_is + 2, my_ip_is + 3);
     
                   printf ("%d.%d.%d.%d\n", my_ip_is[0], my_ip_is[1], my_ip_is[2],
                           my_ip_is[3]);
                }
             }
          }
       }
       return (0);
    }
     
    int main (void)
    {
       init_client ();
       return 0;
    }
    Ca me parait bien compliqué tout ça. Pourquoi ne pas afficher directement la chaine ?
    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
     
    #if 0
             char string_ip[30];
             {
                sprintf (string_ip, inet_ntoa (s_in.sin_addr));
                //extraction en tableau de 4 char
                {
                   int my_ip_is[4]; //report pour artnet poll reply
                   sscanf (string_ip, "%d.%d.%d.%d", my_ip_is, my_ip_is + 1,
                           my_ip_is + 2, my_ip_is + 3);
     
                   printf ("%d.%d.%d.%d\n", my_ip_is[0], my_ip_is[1], my_ip_is[2],
                           my_ip_is[3]);
                }
             }
    #else
             printf ("%s\n", inet_ntoa (s_in.sin_addr));
    #endif

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Par défaut
    bonjour emmanuel, non ne deplace pas, on peut parler printf si tu le desires !
    c est un essai pour un prog en C avec allegro. le cout est juste une facilité d'affichage pour faire des test dans un petit exe a part!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 56
    Par défaut
    merci emmanuel ! tout celà est très clair, je vais nettoyer mes sources ! merci bp et de ta rapidité et de ton efficacité !

Discussions similaires

  1. Réponses: 9
    Dernier message: 31/03/2011, 14h48
  2. Réponses: 5
    Dernier message: 14/10/2009, 12h56
  3. Réponses: 4
    Dernier message: 03/05/2006, 15h30
  4. Réponses: 2
    Dernier message: 11/04/2006, 23h54
  5. [8086] Valeur dans un tableau à partir de son adresse
    Par dridri dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 22/03/2006, 09h39

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