1 2 3
| int tailleS, tailleO;
...
getsockopt(hsocketService,IPPROTO_TCP,TCP_MAXSEG,&tailleS,&tailleO); |
Le rôle de getsocket() est de demander la valeur d'une option à la couche IP/TCP ou autre.
Dans ton cas, tu demande à la couche TCP de la socket hsocketService, la valeur de l'option TCP_MAXSEG (valeur de la fenêtre max TCP, voir le rfc TCP pour plus d'information à ce sujet)
L'option semble TCP_MAXSEG donc retournée dans un int et donc le 4eme paramètre de getsockopt(), tailleS dans ton code, est l'adresse de cet int.
Le 5eme paramètre quant à lui est un paramètre input/output. Il sert lors de l'appel à spécifier la taille du buffer de réception du paramètre et en retour, il contient la taille utilisée du buffer une fois celui ci renseigné. Dans ton cas, il devrait être initialisé avec sizeof(tailleS) (ce que l'on ne voit pas dans ton code) et en retour, il devrait contenir la taille (en octets) du nombre retourné (1, 2, 4 ou même 8 suivant l'implémentation).
Donc dans l'esprit du développeur de ce code, tailleS signifierait "taille max du segment TCP" et tailleO signifierait "taille de l'option".
Une autre chose, il faut absolument vérifier le code retour de getsockopt(). En effet, toutes les piles n'implémente pas toutes les options et il est dangereux d'untiliser la valeur retournée si le code de retour est en erreur (ENOPROTOOPT par exemple
)
Un code un peu meilleur serait donc
1 2 3 4 5 6 7 8 9 10 11
| int tailleS = 0;
int tailleO = sizeof(tailleS);
if(getsockopt(hsocketService, IPPROTO_TCP, TCP_MAXSEG, &tailleS, &tailleO) != 0)
{
// traitement de l'erreur
}
else
{
// traitement de la valeur tailleS
} |
Partager