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ération des informations Clients (SOCKET)


Sujet :

C++

Vue hybride

voltx4 Récupération des informations... 15/08/2004, 16h52
Fry a partir du moment ou le... 15/08/2004, 20h31
voltx4 oui, d'accord mais voila à... 15/08/2004, 22h25
Fry tu dois caster ta structure... 16/08/2004, 19h18
voltx4 Merci Fry d'essayer de... 16/08/2004, 23h18
bleyblue dans... 17/08/2004, 04h20
voltx4 Oui bleyblue , j'utilise bien... 17/08/2004, 13h28
bjousse dans la doc VC++ donc si... 17/08/2004, 15h18
voltx4 Ouiiiiiii , ca fonctionne... 17/08/2004, 16h08
Yabo La gestion de la mémoire pour... 17/08/2004, 16h16
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 38
    Par défaut Récupération des informations Clients (SOCKET)
    Bonjour à tous,

    je voudrais savoir si il est possible de récupérer toutes les informations d'un client à partir de son socket (IP,PORT, ...) :

    Merci à ceux qui se pencheront sur mon cas

  2. #2
    Fry
    Fry est déconnecté
    Membre confirmé Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Par défaut
    a partir du moment ou le client est connecter tu peu recuperer toute les infos de sa SOCK_ADDR (ip, port ) et avec l ip son hostname (et pas mal d autre info)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 38
    Par défaut
    oui, d'accord mais voila à quoi ressemble la structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct sockaddr 
    {
      u_short    sa_family;
      char       sa_data[14];
    };
    il faut utiliser quelle fonction pour récuperer les paramètres ?


    Merci à ceux qui continueront à se pencher sur mon cas ....

  4. #4
    Fry
    Fry est déconnecté
    Membre confirmé Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Par défaut
    tu dois caster ta structure en SOCKADDR_IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct sockaddr_in 
    { 
    short    sin_family; 
    u_short    sin_port; 
    struct  in_addr  sin_addr; 
    char    sin_zero[8];
    };
    la structure in_addr contient:
    4 unsigned char (s_b1, s_b2, sb3 et sb4)
    OU
    2 unsigned short (s_w1 et s_w2)
    OU
    1 unsigned long (S_addr)

    pour mettre une ip dans ta struct in_addr tu peu aussi utiliser cette fonction:
    struct sockaddr_in sock;
    sock.sin_addr.s_addr=inet_addr("147.94.38.17");

    et pour l afficher:
    std::cout << inet_ntoa(sock.sin_addr);

    puis y a aussi les fonction pour les ports:
    short htons(short int arg) /* Host TO Network Short*/
    long htonl(long int arg) /* Host TO Network Long*/
    short ntohs(short int arg) /* Network TO Host Short*/
    long ntohl(long int arg) /* Network TO Host Long*/


    et pour caster t a strcuture c est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sockaddr s;
    sockaddr_in s_in;
    s_in = (sockaddr_in) s;
    si j me rappel bien...
    puis si tu veux faire une conersion plus c++ utilise reinterpret_cast<sockaddr_in>(...) ou autre

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 38
    Par défaut
    Merci Fry d'essayer de résoudre mon problème, c super sympa
    Mais ca marche toujours pas

    Voici le code de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SOCKET buffer_socket;
    sockaddr buffer_sockaddr;
     
    buffer_socket = accept(Server_socket,&buffer_sockaddr,0);
    Mais donc je n'arrive pas à récupérer les infos à partir de la structure sockaddr.

    Donc j'ai essayé comme tu m'as dit de faire, essayer de caster :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SOCKET buffer_socket;
    sockaddr_in buffer_sockaddr;
     
    buffer_socket = accept(Server_socket,(sockaddr*)&buffer_sockaddr,0);
    De cette manière je caste directement les informations. Mais voila ce que je récupère dans la structure

    • sin_family = -13108;
      sin_port = 52428;
      sin_addr.S_addr = 3435973836 (converti en IP => 204.204.204.204)
      sin_zero = "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌH"


    D'après mon instinct naturel , ca me parrait pas tres correct

    J'ai aussi essayer de caster par apres :
    Comme tu m'as dit de faire => ca marche pas (impossible de convertir directement)
    Par le biais d'un memcpy pour copier la structure sockaddr en sockaddr_in.

    Mais rien à faire , je récupère pas les bons paramètres


    : N'y a-t-il pas moyen de les récupérer à l'aide du socket Client (qui lui est correct)


    Merci à ceux qui continueront à se pencher sur mon cas ....

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    Par défaut
    dans accept(Server_socket,&buffer_sockaddr,0);, au lieu de 0 il faut mettre sizeof(sockaddr_in) sinon ça ne marchera pas (cf. msdn).
    PS: je devine au 204.204.204.204 que tu utilises visual c++ ou visual studio!!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 38
    Par défaut
    Oui bleyblue , j'utilise bien Visual Studio , je l'utilise tellement bien qu'en regardant l'aide MSDN fournie avec je constate que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SOCKET accept(
      SOCKET s,
      struct sockaddr FAR *addr,
      int FAR *addrlen
    );
    • addrlen
      [out] Optional pointer to an integer that contains the length of addr.


    Et donc en aucun cas cela ne permet de faire avancer le schmilblik.

    Mais j'ai quand meme essayer toutes les possibilités avec ce paramètre, de mettre un sizeof(), ou de faire une référence vers un INT, ... rien à faire , ce la ne fonctionne toujours pas ... (Ca empire les choses plutôt)

    Mais merci quand même à toi Bleyblue d'essayer de résoudre mon cas (à 3H20 du mat. on ne pond pas forcément QUE des choses censées je connais ca aussi )

    Merci à ceux qui continueront à se pencher sur mon cas ...


    PS: J'ai relu un cours sur les sockets, et il est bien précisé qu'on peut récupérer les informations (IP,PORT) à partir du Accept() mais il n'explique pas comment

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 77
    Par défaut
    dans la doc VC++
    The integer referred to by addrlen initially contains the amount of space pointed to by addr. On return it will contain the actual length in bytes of the address returned.
    donc si on fait quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SOCKET buffer_socket; 
    sockaddr buffer_sockaddr; 
    int lgdonneesinout ;
     
    lgdonneesinout = sizeof(sockaddr)
    buffer_socket = accept(Server_socket,&buffer_sockaddr,&lgdonneesinout ); 
     
    sockaddr_in  *pinfo = (sockaddr_in  *) &buffer_sockaddr ;
    pinfo doit permettre de retrouver pas mal de choses

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 38
    Par défaut
    Ouiiiiiii , ca fonctionne !!!!

    Merci à tous pour votre aide !!!

    Voici le code Final qui fonctionne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SOCKET buffer_socket;
    sockaddr buffer_sockaddr;
    int lgdonneesinout;
     
    lgdonneesinout = sizeof(sockaddr);
    buffer_socket = accept(Server_socket,&buffer_sockaddr,&lgdonneesinout);
     
    sockaddr_in  *pinfo = (sockaddr_in  *) &buffer_sockaddr ; 
     
    char *ip = new char[16];
    ip = inet_ntoa(pinfo->sin_addr);
    (ne pas oublier de libérer la mémoire de IP apres )

    En tout cas encore un grand merci à tous ceux qui se sont penché sur mon cas ...

  10. #10
    Membre très actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Par défaut
    Citation Envoyé par voltx4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SOCKET buffer_socket;
    sockaddr buffer_sockaddr;
    int lgdonneesinout;
     
    lgdonneesinout = sizeof(sockaddr);
    buffer_socket = accept(Server_socket,&buffer_sockaddr,&lgdonneesinout);
     
    sockaddr_in  *pinfo = (sockaddr_in  *) &buffer_sockaddr ; 
     
    char *ip = new char[16];
    ip = inet_ntoa(pinfo->sin_addr);
    (ne pas oublier de libérer la mémoire de IP apres )

    En tout cas encore un grand merci à tous ceux qui se sont penché sur mon cas ...
    La gestion de la mémoire pour ip est fausse et fuis, même si tu delete.

    Tu es en C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::string ip = inet_ntoa(pinfo->sin_addr);

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

Discussions similaires

  1. Récupération des informations relative au poste client
    Par arnolem dans le forum Téléchargez
    Réponses: 0
    Dernier message: 03/10/2011, 09h08
  2. Récupération des informations envoyées avec POST
    Par d.florian dans le forum Langage
    Réponses: 2
    Dernier message: 17/01/2009, 21h59
  3. Réponses: 1
    Dernier message: 26/11/2008, 03h15
  4. Récupération des informations sélectionnées
    Par dubuducu dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2008, 00h08
  5. Récupération des informations memoire
    Par xxiemeciel dans le forum Windows
    Réponses: 2
    Dernier message: 12/08/2005, 16h43

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