L'objectif de ce TP est de se passer de la bibliothèque client_serveur qui avait été utilisée jusque-là, et d'apprendre à utiliser directement les fonctions système. Quelques exercices sont proposés après un résumé des fonctions à utiliser.
Sous Unix, les communications se font à l'aide d'un objet que l'on nomme « socket ».
Celles-ci sont créées par la fonction socket(2) :
int socket(int domaine, int type, int protocole);
où les paramètres domaine et type définissent le type de socket souhaité. Par exemple, pour des communications en TCP/IP, il faut utiliser le domaine AF_INET (pour IPv4) et le type SOCK_STREAM (pour TCP). Le paramètre protocole prend la valeur 0.
Cette fonction retourne un descripteur de fichier pour la socket nouvellement créée, ou -1 en cas d'erreur.
Une fois que la socket est créée, il est possible de la connecter grâce à la fonction :
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
où les paramètres sont :
sockfd est la socket à connecter,addr est l'adresse à laquelle se connecter,addrlen est la taille de la structure pointée par addr.Les adresses IP sont codées dans une structure de type sockaddr_in :
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
où :
sin_family prend la valeur AF_INET,