Obtenir un port aléatoire pour socket UDP
J'ai besoin de créer un programme qui permettra de communiquer avec d'autres programmes sur le même ordinateur via les sockets UDP. Il lit les commandes à partir de stdin, et certaines de ces commandes, il sera à envoyer/recevoir des paquets sans arrêter l'exécution. J'ai lu quelques informations là-bas, mais depuis que je ne suis pas familier avec la prise de la programmation et de la nécessité de faire ça rapidement, j'ai les questions suivantes:
- J'ai besoin d'obtenir de façon aléatoire un port inutilisé pour le programme d'écouter, et de la réserve afin que d'autres programmes peuvent communiquer avec cette et aussi le port n'est pas réservé par un autre programme. J'ai aussi besoin de stocker le numéro de port sur une variable pour un usage futur.
- Puisque la communication est à travers des processus sur la même machine, je me demandais si je peux utiliser le nom pf_local.
Aussi un exemple de code de l'installation d'une telle prise serait la bienvenue, ainsi qu'un exemple de l'envoi/réception de chaînes de caractères.
source d'informationauteur rabusmar
Vous devez vous connecter pour publier un commentaire.
Appel
bind()
spécifiant le port 0. Qui va permettre à l'OS de choisir un port inutilisé. Vous pouvez ensuite utilisergetsockname()
pour récupérer le port choisi.Réponse par Remy Lebeau est bon si vous avez besoin d'un temporaire de port. Il n'est pas si bon, si vous avez besoin d'un persistante de port réservé parce que d'autres en outre, le logiciel utilise la même méthode pour obtenir un port (y compris les OS pile TCP qui a besoin d'un nouveau temporaire de port pour chaque connexion).
Donc la suivante peut se produire:
Alors vous avez besoin par exemple de redémarrer le logiciel:
Donc pour l'avenir "utilise" vous avez besoin d'un port qui n'est pas dans la plage de ports éphémères (c'est la plage à partir de laquelle bind(hôte, 0) renvoie un port).
Ma solution pour ce problème est la -port-pour utilitaire de ligne de commande.
Si c'était un port aléatoire qui est réellement important, vous devez faire quelque chose comme:
Puis spécifier ce port dans bind. Si elle échoue, choisissez-en une nouvelle (pas besoin de re-seed, le générateur aléatoire. Si le port aléatoire n'est pas important, regardez Remy Lebeau la réponse.