La taille de la taille de l’adresse de la fonction accept dans

dans “sys / socket.h”, il définit la fonction:

int accept (int socket, struct sockaddr *address, socklen_t *address_len); 

Ma question concerne socklen_t * address_len qui, sur la base du manuel, pointe vers un socklen_t qui, en entrée, spécifie la longueur de la structure sockaddr fournie, et en sortie, la longueur de l’adresse stockée.

Dans quelles conditions la taille d’entrée address_len sera-t-elle différente de la sortie?

J’ai besoin de cela pour pouvoir émuler un scénario de test sur un wrapper que j’ai créé pour la structure sockaddr_in .

Merci beaucoup!

Cela ne peut jamais être plus long (la longueur en entrée est une limite pour éviter les débordements), mais cela pourrait être inférieur pour certains types de socket, par exemple les sockets de domaine unix dont les adresses sont essentiellement des chemins d’access. Pour les sockets IP (v4 ou v6), il s’agira toujours de la taille nominale de la structure sockaddr_in ou sockaddr_in6 correspondante.

Notez également qu’il est possible d’utiliser certaines interfaces de ce type sans savoir quel type d’adresse / de famille de protocole est impliqué . Par exemple, votre code de bibliothèque peut contenir une fonction qui prend un socket de type inconnu et appelle accept avec une structure sockaddr_storage . Selon ce que l’appelant a fait, il peut trouver une adresse IPv4 et une adresse IPv6, ou quelque chose d’autre.

Cette utilisation est assez peu habituelle pour accept , mais elle est beaucoup plus probable pour getpeername qui utilise le même style d’interface. En fait, tous les démons qui exécutent inetd et qui souhaitent connaître l’adresse distante doivent fonctionner de cette façon.