Les options de socket sous Unix sont des paramètres qui contrôlent le comportement d’une socket. Ils vous permettent d'affiner divers aspects de la communication réseau, tels que le niveau de vérification des erreurs, la manière dont les données sont transmises et les performances globales de votre application. Ces options sont définies à l'aide de l'appel système `setsockopt()` et récupérées à l'aide de `getsockopt()`.
Les options de socket sont organisées par *niveaux* et *noms*. Le niveau spécifie la couche de protocole à laquelle l'option s'applique, tandis que le nom identifie l'option spécifique au sein de ce niveau. Les niveaux courants incluent :
* `SOL_SOCKET` : Ce niveau s'applique à tous les types de sockets. Les options à ce niveau affectent le comportement général du socket. Les exemples incluent :
* `SO_REUSEADDR` : Permet la liaison à un port qui est déjà dans l'état TIME_WAIT. Utile pour les serveurs qui doivent redémarrer rapidement.
* `SO_REUSEPORT` : Permet à plusieurs processus de se lier à la même adresse et au même port. Utile pour l'équilibrage de charge et le clustering de serveurs.
* `SO_BROADCAST` : Permet d'envoyer des messages diffusés.
* `SO_KEEPALIVE` : Permet aux sondes keep-alive de détecter les connexions rompues.
* `SO_LINGER` : Contrôle le comportement du socket lorsqu'il est fermé. Permet un arrêt progressif ou une fermeture immédiate.
* `SO_SNDBUF` et `SO_RCVBUF` : Définissez respectivement les tailles de tampon d'envoi et de réception. Les ajuster peut améliorer les performances.
* `SO_ERROR` : Récupère les conditions d’erreur en attente sur le socket.
* `IPPROTO_IP` : Ce niveau s'applique aux sockets IPv4. Les options ici influencent la façon dont la couche IP gère les paquets. Les exemples incluent :
* `IP_TOS` : Définit les bits de type de service (ToS) dans l’en-tête IP. Utilisé pour des considérations de qualité de service (QoS).
* `IP_TTL` : Définit la valeur Time To Live (TTL), qui limite la durée de vie d'un paquet.
* `IPPROTO_IPV6` : Ce niveau est similaire à `IPPROTO_IP` mais pour les sockets IPv6. De nombreuses options sont analogues à leurs homologues IPv4.
* `IPPROTO_TCP` : Ce niveau s'applique aux sockets TCP. Les options ici contrôlent les comportements spécifiques à TCP. Les exemples incluent :
* `TCP_NODELAY` : Désactive l'algorithme Nagle, qui met en mémoire tampon les petits paquets avant l'envoi. Utile pour les applications interactives, mais peut réduire l'efficacité des transferts en masse.
* `IPPROTO_UDP` : Ce niveau s'applique aux sockets UDP. Les options ici sont relativement peu nombreuses par rapport à TCP.
Exemple (C) :
Cet exemple montre comment définir l'option `SO_REUSEADDR` à l'aide de `setsockopt()` :
```c
#include
#include
#include
#include
#include
#include
#include
int main() {
int chaussettefd;
struct sockaddr_in serv_addr ;
int opt =1 ; // Pour activer SO_REUSEADDR
sockfd =socket(AF_INET, SOCK_STREAM, 0);
si (sockfd <0) {
perror("Erreur d'ouverture du socket");
sortie(1);
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) <0) {
perror("échec de setsockopt");
sortie(1);
}
// ... reste de votre code de socket ...
fermer(sockfd);
renvoie 0 ;
}
```
Cet extrait de code crée un socket TCP et définit l'option `SO_REUSEADDR`. La gestion des erreurs est incluse pour afficher les meilleures pratiques. N'oubliez pas de consulter les pages de manuel de votre système (« man 7 socket ») pour une liste complète des options de socket disponibles et leur utilisation. La disponibilité et le comportement d'options spécifiques peuvent varier légèrement en fonction du système d'exploitation et de la version du noyau.
|