1
votes

Puis-je appeler bind () puis connect () sur le même descripteur de socket?

Juste une question curieuse sur la programmation de socket réseau dans une application Windows avec C / C ++:

Comment puis-je dire à la fonction connect () d'utiliser une adresse IP source et des valeurs de port source particulières?

  • Après la création d'un socket, l'application appelle connect () à l'adresse IP et au port distants en utilisant la structure sockaddr .

  • la fonction connect () sélectionne en interne l'adresse IP source et le port de la connexion.

Plutôt que que le système décide de l'adresse IP source et / ou du port pour connect () , que ce soit la responsabilité de l'application de décider à quelle adresse IP source et / ou port se lier.


3 commentaires

"Si le socket est indépendant, valeurs uniques sont attribués à l'association locale par le système et le socket est marqué comme lié. "


Vous devez appeler bind si vous souhaitez spécifier la combinaison interface / port à utiliser.


" Que ce soit la responsabilité des applications de décider du port source ou de l'adresse IP à laquelle se lier " - notez que bien qu'il puisse effectivement y avoir des raisons d'adopter cette approche avec un socket, vous allez vous connecter ( ) , ils sont au mieux rares. Le port source d'une telle connexion n'est normalement pas significatif au niveau de l'application, et il existe rarement de nombreuses options pour l'adresse IP source (sauf si la machine se connecte à elle-même).


3 Réponses :


2
votes

Comment puis-je dire à la fonction connect () d'utiliser une adresse IP source et des valeurs de port source particulières?

Utilisez la fonction bind () de la bibliothèque de sockets pour cela. Oui, vous pouvez appeler bind () avant connect () pour une socket sortante. C'est une opération parfaitement légitime pour les sockets UDP et TCP.


0 commentaires

3
votes

bind () demande un port qui n'est pas utilisé afin qu'il puisse le réclamer et devenir un serveur, tandis que connect () veut un port qui est déjà utilisé, pour qu'il puisse s'y connecter et parler au serveur.

Comme l'a dit l'utilisateur stark , vous devez appeler bind si vous souhaitez spécifier la combinaison interface / port à utiliser, mais si vous souhaitez que le prochain appel le lie un numéro de port disponible aléatoire, vous pouvez désactiver l'appel bind () car le client ne doit pas nécessairement avoir un numéro de port fixe.

Il est possible de demander au noyau de sélectionner un port spécifique avant d'appeler connect () , mais si je peux demander - pourquoi vous ne voudriez pas que le noyau alloue des ports sources, dans la mesure où Je sais que ce n'est pas la meilleure pratique.


1 commentaires

Quelques cas d'utilisation qui me viennent à l'esprit: il est possible de lier une socket à une interface sans se lier à un port (ici, le port sera sélectionné lors de l'appel de connect.). En outre, dans le réseau P2P, une allocation de port explicite est nécessaire avant que la connexion ne soit appelée pour activer la traversée NAT.



0
votes

Oui, vous pouvez. En effet, il y a une raison de le faire: Si votre politique de routage permet d'établir votre connexion à partir d'une adresse IP qui n'est pas celle que vous souhaitez utiliser, vous pouvez forcer un hôte multirésident / de routage à adresse IP spécifique comme source au moyen de l'appel système bind (2) . Une autre utilisation consiste à spécifier un port source fixe pour la connexion, mais ce n'est pas aussi courant que dans le cas précédent.

Mais attention: vous ne pouvez sélectionner qu'une seule des adresses IP déjà configurées que vous avez, pas une adresse que vous pouvez imaginer.


0 commentaires