Vous avez peut-être essayé de nombreuses fonctions C, de nombreuses fonctions de bibliothèque POSIX C et des fonctions C basées sur UNIX dans vos programmes. La plupart des fonctions C liées à POSIX ou aux réseaux utilisent certains drapeaux dans leurs parenthèses comme argument ou utilisés à des fins spécifiques. Avez-vous déjà essayé d'apprendre des drapeaux intégrés lors de la programmation? Sinon, c'est totalement bien.
Nous discuterons de l'utilisation du drapeau SO_REUSEADDR de C dans cet article. Il s'agit d'un drapeau de type booléen entier qui spécifie si la réutilisation de l'adresse locale doit être autorisée par les règles utilisées pour valider les adresses fournies dans les appels du système de liaison. Cela signifie qu'une prise peut se lier pour les prises AF_INET, sauf la présence d'une prise d'écoute active connectée à l'adresse. Il n'est pas possible de se lier au port spécifié d'un socket d'écoute lorsqu'il est configuré à inaddr_any pour toute adresse locale.
La méthode de liaison peut réutiliser l'adresse locale après avoir utilisé le drapeau SO_REUSEADDR. Notez que l'adresse locale, qui est composée d'adresse IP et de numéro de port, signifie que deux adresses locales peuvent coexister en elles-mêmes si une pièce IP ou un numéro de port est différente et ne nécessite donc pas l'application de ce drapeau. L'adresse locale ne peut pas être utilisée avec ce paramètre si elle a déjà été accessible par une prise qui est dans un état d'écoute. Lorsque l'adresse locale de la prise est à l'état d'écoute et que le composant IP de l'adresse est inadddr, tous les IP locaux sont surveillés. La liaison ne peut plus soutenir aucune adresse locale pour ce port, même avec cet argument.
Exemple:
Voici le code client utilisé pour que les clients se connectent au serveur à l'aide des deux adresses IP distinctes. Le client dans l'exemple suivant souhaite se connecter au serveur qui utilise un numéro de port différent mais la même adresse IP. L'adresse IP hôte locale et la valeur du port ont été transmises à la fonction connect_tcp dans le premier appel où ils ont été définis sur 8888.
Cependant, après une liaison à l'adresse locale, le système a utilisé le domaine de socket Unix pour effectuer une deuxième connexion de socket où l'adresse IP est restée la même, mais le numéro de port a été modifié en 7777. Cela signifie qu'un client est connecté à deux adresses de socket différentes sur une seule demande TCP, ce qui est concevable car les adresses sont différentes. Ce code est lié à la machine ciblée après avoir lié l'adresse locale d'abord. Les deux tentatives de liaison devraient réussir parce que, comme le montre la partie IP susmentionnée, la partie IP des adresses locales des deux connexions de liaison varie.
En utilisant un terminal de ligne de commande Linux, compilez le code à l'aide du compilateur GCC pour le code de la langue C:
À l'aide de la commande NCAT, nous imitons le serveur:
Pour afficher chaque statut de socket pour le numéro de port 7777, utilisez la commande SS:
La sortie suivante affiche l'état de la prise pour le numéro de port 7777:
Comme le montre la capture d'écran Pevious, il n'y a plus d'autre connexion et le serveur NCAT écoute sur le port 7777. Après avoir exécuté le fichier de sortie créé dans l'étape de compilation, exécutez-le.
Maintenant, exécutez la même commande après avoir exécuté le fichier de sortie du code précédent dans le terminal Linux. Notez qu'il y a deux appels à la connexion Connect_TCP, puis quatre connexions sont établies lors de ces appels.
Maintenant que deux connexions sont établies avec succès, une utilisant 127.0.0.1 et le port 7777 et l'autre à l'aide du port 8888, nous avons reçu la sortie suivante. Il y a quatre connexions dans l'ensemble dans l'écran suivant car nous avons invoqué deux fois la méthode Connect TCP:
Il y a quatre connexions d'état ESTAB (établir) visibles, ce qui est normal car la sortie est du côté serveur et du côté client, respectivement. Les trois premières lignes sont écrites du point de vue du serveur tandis que les deux suivants sont présentés à partir de celui du client. Le nom de processus en arrière-plan montre également cela. Avant de rejoindre, le client peut connecter de nombreuses adresses IP locales, et le serveur peut faire la même chose en utilisant une cible. Il peut se lier à une variété d'adresses locales avant de surveiller sans l'argument SO_REUSEADDR. Nous ne l'illustrons pas maintenant parce que le code logiciel est similaire. Le code lie d'abord l'adresse locale à l'adresse cible, qui est soit 127.0.0.1: 7777 ou 127.0.0.1: 7778, puis effectuez une connexion à ces adresses IP.
Lorsque nous exécutons ce client, il affiche à l'écran «l'adresse déjà utilisée» indiquant que le premier client a cette adresse. Le code précédent est désormais modifié en ajoutant simplement quelques lignes supplémentaires du code pour utiliser l'indicateur SO Reuseaddr. Nous souhaitons connecter notre client à une adresse de socket similaire déjà utilisée ou détenue par un autre client. Voici l'extrait de code du code modifié:
Nous avons utilisé l'éditeur VIM pour ouvrir le fichier et ajouté le code en mode d'insertion.
Recompiler le code. Mais avant de le faire, prenez note des éléments suivants: Créez un nouveau fichier ou utilisez un existant et modifiez le nom du fichier de sortie lors de la compilation. Après la compilation, exécutez le fichier de sortie à l'aide du terminal de ligne de commande. Après l'exécution, nous pouvons voir qu'un client est connecté à la même adresse IP et numéro de port où notre premier client a été connecté. C'est parce que nous avons utilisé le drapeau SO_REUSEADDR.
Conclusion
Il s'agit de l'utilisation du paramètre SO_REUSEADDR SONKET qui est un drapeau de type booléen dans la langue C. Nous avons vu un exemple en utilisant le paramètre SO_REUSEADDR SOLKET pour spécifier si l'adresse locale réutilisée dans d'autres programmes ou threads devrait être autorisé par les instructions utilisées pour authentifier les adresses uniquement si dans les appels du système de liaison.