Récupération de l'adresse ip avec recvfrom() [Débutant] - C++ - Programmation
Marsh Posté le 26-05-2006 à 09:43:07
cast en sockaddr_in :
inet_ntoa(((const sockaddr_in*)&SenderAddr)->sin_addr)
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.
Marsh Posté le 26-05-2006 à 19:22:09
vilcocoy a écrit : Merci beaucoup Taz ! |
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++
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 !
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 :
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 !