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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

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

  3. #3
    Membre éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    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 éclairé
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    593
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 593
    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
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    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.

+ 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, 11h01
  2. Problème fonction SDL
    Par seeme dans le forum SDL
    Réponses: 2
    Dernier message: 06/11/2005, 20h22
  3. Problème fonction PL/SQL
    Par SSJ17Vegeta dans le forum PL/SQL
    Réponses: 2
    Dernier message: 29/10/2005, 21h14
  4. Problème fonction et trigger sous 7.2
    Par anoukhan dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/06/2005, 22h53
  5. Réponses: 2
    Dernier message: 20/08/2004, 17h10

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