web-dev-qa-db-fra.com

Comment se lier à n'importe quel port disponible?

J'ai besoin d'une application qui envoie un paquet UDP à un serveur réseau et reçoit la réponse. Le serveur répond au même numéro de port d'où la demande est venue, donc je dois d'abord lier () ma socket à n'importe quel numéro de port UDP.

Le codage en dur du numéro de port UDP est une mauvaise idée, car il pourrait être utilisé par toute autre application exécutée sur le même PC.

Existe-t-il un moyen de lier un socket UDP à n'importe quel port disponible? OMI, cela devrait être un moyen efficace d'obtenir rapidement un numéro de port libre, qui est utilisé par ex. accepter () fonction.

Si non, quelle est la meilleure stratégie pour essayer de lier et vérifier l'état WSAEADDRINUSE/EADDRINUSE: essayez les ports séquentiellement à partir de 1025, ou 1025 + Rand (), ou autre?

44
Soonts

Appelez sendto sans appeler d'abord bind, le socket sera automatiquement lié (à un port libre).

36
avakar

Une autre option consiste à spécifier le port 0 sur bind(). Cela vous permettra de vous lier à une adresse IP spécifique (au cas où vous auriez multiple installé) tout en vous liant à un port aléatoire. Si vous avez besoin de savoir quel port a été choisi, vous pouvez utiliser getsockname() une fois la liaison effectuée.

209
Remy Lebeau

Je dois manquer quelque chose, pourquoi n'utilisez-vous pas la prise udp pour renvoyer des données? Commencez avec sendto, puis utilisez la fonction recvfrom pour lire les données entrantes.Vous obtenez également en prime l'adresse à partir de laquelle les données ont été envoyées, juste là pour que vous renvoyiez une réponse.

0
Jonke