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

Linux Discussion :

Recuperation IP client, Sockets


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Recuperation IP client, Sockets
    Bonjour,

    Je suis actuellement en train de bosser sur un mini serveur en c++.
    Tout ce qui est reseau passe donc par les sockets.
    Histoire d'améliorer un petit peu j'aimerais que, quand l'utilisateur se connecte, le serveur recupere l'adresse IP du client.
    Pour windows j'ai ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     t_socketlist		*list;
    #ifdef WIN32
      int			sin_size;
    #else
      socklen_t		sin_size;
    #endif
      //int			i;
      SOCKADDR_IN   addr;
     
      sin_size = sizeof(addr);
    getpeername(fd, (SOCKADDR *)&addr, &sin_size);
    std::cout << "Client " << inet_ntoa(addr.sin_addr) << std::endl;
    Le probleme est qu'aparement sous UNIX, getpeername ne prends pas une struct sockaddr_in en parametre, mais une struct sockaddr, qui ne permet pas d'utiliter inet_ntoa ou toute autre fonction (dumoins dans la limite de mes connaissanes ^^) qui renverrait l'adresse IP.
    Ma question serait donc : si quelqu'un sait comment faire pour recuperer l'adresse IP sous UNIX, je suis assez preneur...
    Merci d'avance

  2. #2
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    T'as suivi de tuto?
    gethostbyname?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    J'ai effectivement suivi ce tuto, et pour Windows, tout va bien.

    C'est vraiment dans le cas d'UNIX que ca merde.
    Tu me proposes "gethostbyname", mais si j'en crois le man :
    struct hostent *gethostbyname(const char *name);
    Hors, pour le moment la seule fonction que j'ai croisee et qui permet de recuperer l'IP (enfin sur Windows en tout cas) c'est inet_ntoa, et qui prend un struct sockaddr_in (char * inet_ntoa (struct in_addr in)

    En admettant que la structure hostent renvoyee par gethostbyname soit utilisable pour recuperer l'IP du client, je ne vois pas du tout comment recuperer le "const char *name" que me demande gethostbyname :[

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Heuuu bon je viens de reessayer sur une netbsd et une ubuntu et ca marche...
    Donc on va dire que j'etait fatigue la derniere fois que j'ai essaye... desole :[

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    et ça ? (tiré du code de HTTP)

    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
     
    char *Core_GetRemoteLogName(FILE *fd) {
        int len;
        char *result=NULL;
    #ifdef NEXT
        struct sockaddr sa_server, sa_client;
    #else
    #ifdef LINUX
        struct sockaddr sa_server, sa_client;
    #else
        struct sockaddr_in sa_server,sa_client;
    #endif
    #endif
        len = sizeof(sa_client);
        if(getpeername(fileno(stdout),&sa_client,&len) != -1) {
            len = sizeof(sa_server);
            if(getsockname(fileno(stdout),&sa_server,&len) == -1)
                result = "unknown";
    /*        else */
    /*             result = rfc931((struct sockaddr_in *) & sa_client, */
    /*                                     (struct sockaddr_in *) & sa_server); */
         }
        else result = "unknown";
     
        return result; /* robm=pinhead */
    }

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

Discussions similaires

  1. Probleme client socket
    Par BOUBOU81 dans le forum C++Builder
    Réponses: 7
    Dernier message: 19/04/2010, 22h03
  2. Réponses: 2
    Dernier message: 05/01/2009, 18h12
  3. un Tserversocket pour plusieurs clients socket?
    Par andyafrique dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/10/2006, 22h02
  4. Récupérer comptes clients
    Par roger12 dans le forum Réseau
    Réponses: 1
    Dernier message: 22/12/2005, 17h51
  5. Réponses: 9
    Dernier message: 17/08/2004, 17h16

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