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 :

Problème fonction getpeerhost


Sujet :

Réseau C

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut Problème fonction getpeerhost
    Bonjour,

    Je fais un programme pourtant tout simple qui affiche juste l'ip du client s'y connectant, mais la fonction getpeername affiche n'importe quoi à la place de l'adresse ip:

    Connection established successfully with 0.96.160.225:11753!

    Mon code:

    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
     
    #include ....
     
    int main(int argc, char *argv[])
    {
        int listenfd = 0, connfd = 0;
        struct sockaddr_in serv_addr;
     
        char sendBuff[1025];
        time_t ticks;
     
        listenfd = socket(AF_INET, SOCK_STREAM, 0);
        memset(&serv_addr, '0', sizeof(serv_addr));
        memset(sendBuff, '0', sizeof(sendBuff));
       serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        serv_addr.sin_port = htons(1664);
     
        bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
     
        listen(listenfd, 10);
     
        while(1)
        {
            connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
     
            struct sockaddr_in m_addr;
            socklen_t len;
     
         char ipstr[INET_ADDRSTRLEN];
        bzero(ipstr, 50);
        struct sockaddr_in *address;
       socklen_t address_len = sizeof(*address);
       getpeername(listenfd, (struct sockaddr *) address, &address_len);
       inet_ntop(AF_INET, &address->sin_addr, ipstr, sizeof(ipstr));
     
       printf("Connection established successfully with %s:%i!\n", ipstr, ntohs(address->sin_port));
     
            ticks = time(NULL);
            snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
            write(connfd, sendBuff, strlen(sendBuff));
     
            close(connfd);
            sleep(1);
         }
    }
    Avez vous une explication?

    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 599
    Points
    23 599
    Par défaut
    Bonjour,

    Ce n'est pas sur listenfd qui faut lancer getpeername(), mais sur connfd.

  3. #3
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Ca serait plus logique , mais j'ai le même résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getpeername(connfd, (struct sockaddr *) address, &address_len);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Connection established successfully with 0.96.160.225:11753!

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 599
    Points
    23 599
    Par défaut
    Pour le numéro de port, c'est normal. En l'absence d'indications particulières, le système du client lui choisit automatiquement un port source au hasard et supérieur à 1024. Cela dit, ça ne veut pas dire qu'il est forcément correct.

    Vérifie les codes de retour de getpeername() et inet_ntop(), car ces fonctions peuvent échouer comme les autres.

  5. #5
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    C'est pas le port le problème, il me semble juste. C'est l'adresse IP.
    La fonction getpeername renvoit -1, c'est par la que ca coince.
    inet_ntop me renvoit l'ip louche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int ret = getpeername(listenfd, (struct sockaddr *) &address, &address_len);
     
    printf ("retour: %d\n", ret);
     
    char *ipstr2;
    ipstr2 =  inet_ntop(AF_INET, &address->sin_addr, ipstr, sizeof(ipstr));
     
    printf ("retour2: %s\n", ipstr2);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    retour: -1
    retour2: 11.255.255.154
    Connection established successfully with 11.255.255.154:22499!

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 599
    Points
    23 599
    Par défaut
    Si getpeername() te renvoie -1, c'est qu'elle a échoué. Et dans ce cas, elle ne va pas renvoyer une adresse IP générique (par exemple « 0.0.0.0 ») mais va probablement laisser la structure d'accueil en l'état. Elle contient donc des données indéfinies.

    Essaie d'utiliser perror("") juste après getpeername() pour avoir facilement un message d'erreur.

  7. #7
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Ok, voici ce que ca me sort:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bind: Success
    listen: Success
    accept: Success
    getpeername: Bad address
    inet_ntop: Bad address
    Connection established successfully with 0.96.160.225:11753!

  8. #8
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    \o/ ca marche!

    En changeant de sockaddr_in à sockaddr_storage c'est tombé en marche:

    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
     
    struct sockaddr_storage address;
    //socklen_t address_len = sizeof(*address);
    int address_len = sizeof address;
     
    getpeername(connfd, (struct sockaddr *) &address, &address_len);
    perror("getpeername");
     
    int port;
     
    // deal with both IPv4 and IPv6:
    if (address.ss_family == AF_INET) {
        struct sockaddr_in *s = (struct sockaddr_in *)&address;
        port = ntohs(s->sin_port);
        inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
    Merci pour ton aide

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

Discussions similaires

  1. Problème : Fonctions et commande Execute
    Par bubi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/11/2005, 12h01
  2. Problème fonction SDL
    Par seeme dans le forum SDL
    Réponses: 2
    Dernier message: 06/11/2005, 21h22
  3. Problème fonction PL/SQL
    Par SSJ17Vegeta dans le forum PL/SQL
    Réponses: 2
    Dernier message: 29/10/2005, 22h14
  4. Problème fonction et trigger sous 7.2
    Par anoukhan dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/06/2005, 23h53
  5. Réponses: 2
    Dernier message: 20/08/2004, 18h10

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