Récupération de l'adresse ip avec recvfrom() [Débutant]

Récupération de l'adresse ip avec recvfrom() [Débutant] - C++ - Programmation

Marsh Posté le 25-05-2006 à 19:30:23    

Bonjour,
 
J'ai créé une petite appli client-serveur dont le but est de faire exécuter la commande reçue par le serveur.
 
Voici mon code :
 

Code :
  1. int nb_caracteres; // Indique le nombre de caractères qui a été reçu ou envoyé
  2. char buffer[65535]; // Tampon contenant les données reçues ou envoyées
  3. char * motdepasse;
  4. char * commande;
  5. struct sockaddr SenderAddr;  // je déclare la structure qui doit recevoir l'ip emetteur
  6. int SenderAddrSize = sizeof(SenderAddr);
  7. while (1)
  8. {
  9. nb_caracteres=recvfrom(id_de_la_socket,buffer,1515,0,&SenderAddr, &SenderAddrSize); // je passe la structure sockaddr en paramètre de recvfrom()
  10. buffer[nb_caracteres]=0;
  11. motdepasse = strtok (buffer," " );
  12. commande = strtok (NULL," " );
  13. if (strcmp(password,motdepasse)==0)
  14. {
  15. printf("\nExecution de %s\n",commande);
  16. printf("%s",inet_ntoa(SenderAddr.sin_addr)); // je tente d'afficher l'ip emetteur
  17. system (commande);
  18. }
  19. else (blabla...)


 
A la compilation, j'ai l'erreur suivante :
 
'struct sockaddr' has no member named 'sin_addr'  
 
J'ai essayé plusieurs trucs, mais je n'arrive pas à utiliser comme il faut recvfrom() ou la structure sockaddr pour afficher l'adresse ip de l'émetteur.
 
J'espère que c'est assez clair et complet...
 
Merci !

Reply

Marsh Posté le 25-05-2006 à 19:30:23   

Reply

Marsh Posté le 26-05-2006 à 09:43:07    

cast en sockaddr_in :
 
inet_ntoa(((const sockaddr_in*)&SenderAddr)->sin_addr)

Reply

Marsh Posté le 26-05-2006 à 17:27:28    

Merci beaucoup Taz !
 
J'ai testé, ça fonctionne.
Mais je dois avouer que c'est un peu en aveugle : le concept du ((const sockaddr_in*)&sendraddr)->sin_addr) m'échappe complètement...
 
En tout cas merci.

Reply

Marsh Posté le 26-05-2006 à 19:22:09    

vilcocoy a écrit :

Merci beaucoup Taz !
 
J'ai testé, ça fonctionne.


Quand Taz dit un truc, ça fonctionne toujours (et putain pourtant j'aime pas ses façons qu'il a eu de m'allumer parfois mais ch'suis bien obligé de dire ce qui est...)
 

vilcocoy a écrit :

Mais je dois avouer que c'est un peu en aveugle : le concept du ((const sockaddr_in*)&sendraddr)->sin_addr) m'échappe complètement...


La fonction "inet_ntoa()" attend en entrée un "struct in_addr". Toi, tu lui passes un "struct sockaddr". Ca ne peut pas coller
Donc on commences pa récupérer l'adresse de "senraddr" qu'on convertit en "adresse sur sockaddr_in" (quoique moi j'aurais mis "const struct sockaddr_in *" ).
Cette structure contient un membre nommé "sin_addr" de type "struct in_addr". Donc on passe à "inet_ntoa()" ce qu'il attend (l'adresse IP) et au bon type
 
En fait, quand la doc sur les socket parle de "struct sockaddr", il faut bien comprendre que c'est dans un cadre "généraliste" car les sockets sont présentes dans 2 domaines
- domaine Unix (les fichiers "s" ) => les protocoles t'imposent de travailler avec des "struct sockaddr_un"
- domaine Internet (TCP/IP) => les protocoles t'imposent de travailler avec des "struct sockaddr_in"
Comme les fonctions de haut niveau sont toujours les mêmes (création de la socket, écoute du réseau, connexion au réseau) et que la différence ne se fait que dans la nature de la socket, les fonctions de haut niveau restent généralistes et utilisent une structure de base "struct sockaddr".
Toi, si tu dois faire un pgm dans l'un ou l'autre domaine, il vaut mieux que tu utilises la structure adaptée à ton domaine. Sinon, t'es obligé de convertir ton adresse de structure en "adresse de la structure adaptée à ton domaine" quand tu as besoin d'un élément précis de ton domaine (ici, c'est l'IP qui n'existe que dans le domaine Internet)
 
Cours sur les sockets ici: http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf
 
PS: Ce topic devrait être en cat. C et pas C++

Message cité 1 fois
Message édité par Sve@r le 26-05-2006 à 19:26:53

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 27-05-2006 à 17:45:03    

Sve@r a écrit :

Quand Taz dit un truc, ça fonctionne toujours (et putain pourtant j'aime pas ses façons qu'il a eu de m'allumer parfois mais ch'suis bien obligé de dire ce qui est...)


Je ne me permettrais pas d'en douter ...

Sve@r a écrit :

La fonction "inet_ntoa()" attend en entrée un "struct in_addr". Toi, tu lui passes un "struct sockaddr". Ca ne peut pas coller(...)


Merci pour tes éclaircissements, le document sur les sockets est très instructif.

Sve@r a écrit :

PS: Ce topic devrait être en cat. C et pas C++


Oups... désolé
 
A bientôt et encore merci !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed