On ne parle pas vraiment de bibliothèque quand on parle d'un .h. Une bibliothèque c'est souvent plus gros. On parle plutôt de header, ou de fichier d'en-tête en français.
Ici :
struct sockaddr_in sa;
Tu déclares une structure de type sockaddr_in qui s'appelle sa.
Il se trouve que le header
in.h du répertoire netinet contient la définition de ce type :
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
};
Si tu n'inclus pas ce header, le compilateur ne connais pas le type sockaddr_in et ne peut donc pas compiler ton programme.
Outre le type sockaddr_in, in.h contient des information diverses concernant les sockets, telles que les principaux ports, par exemple :
IPPORT_TELNET = 23,
La taille sur laquelle est codée un numéro de port :
typedef uint16_t in_port_t;
(Les ports vont de 0 à 65535).
La taille représentant les adresses IP :
typedef uint32_t in_addr_t;
(Les adresses IP, représentée XXXX.XXXX.XXXX.XXXX sont codées sur 4 octets).
Je ne crois pas que le reste soit souvent utilisé, notamment la partie IPv6 (Presque tout le monde est encore en IPv4 à l'heure actuelle).