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++
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.