Pour faire suite à l’article sur la théorie, voici l’article sur la pratique en C.
Le principe est simple : tout d’abord nous allons mettre toutes les fonctions en C dont ont besoin un client ou un serveur pour gérer les sockets réseau dans un couple de fichiers sockets.h et sockets.c que voici :
sockets.h :
/*
* sockets.h
* ---------
* Interface des fonctions réseau TCP/UDP, compatible IPv4 et IPv6.
*/
#ifndef SOCKETS_H
#define SOCKETS_H
#include <stddef.h> /* pour size_t */
/*
* Crée une socket TCP en écoute sur le port donné (ex: "56000").
* Retourne un descripteur prêt pour accepter_client(), ou -1 en cas d'erreur.
*/
int etablir_socket_ecoute_tcp(const char *port);
/*
* Crée une socket UDP liée au port donné.
* Retourne un descripteur, ou -1 en cas d'erreur.
*/
int etablir_socket_ecoute_udp(const char *port);
/*
* Se connecte en TCP à hote:port (IPv4 ou IPv6, automatique).
* Retourne un descripteur connecté, ou -1.
*/
int contacter_socket_tcp(const char *hote, const char *port);
/*
* Se connecte en UDP à hote:port.
* Retourne un descripteur, ou -1.
*/
int contacter_socket_udp(const char *hote, const char *port);
/*
* Accepte une connexion entrante sur la socket d'écoute fd_ecoute.
* - fd_ecoute : descripteur renvoyé par etablir_socket_ecoute_tcp()
* - adresse_client : buffer où sera écrite l'adresse IP du client
* (chaîne lisible, ex: "127.0.0.1" ou "::1")
* - taille_adresse : taille du buffer ci-dessus
*
* Retourne le descripteur de la connexion client, ou -1.
* Aucun struct sockaddr n'est exposé à l'appelant.
*/
int accepter_client(int fd_ecoute, char *adresse_client, size_t taille_adresse);
#endif /* SOCKETS_H */
Comme on peut le voir, on a à notre disposition 4 fonctions : 2 fonctions destinées à être utilisées par les programmes serveurs (etablir_socket_ecoute_tcp et etablir_socket_ecoute_tcp) et 2 fonctions destinées à être utilisées par les programmes clients (contacter_socket_tcp et contacter_socket_udp).
Le code de ces fonctions est prévu pour tenter des connexions IPv6 si disponible, et de basculer automatiquement sur IPv4 si IPv6 n’est pas disponible pour la connexion.
Continuer la lecture
