Comment se lier à n'importe quel port disponible?
Je 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 où la demande est venue de partir, si j'ai d'abord besoin de bind() de ma prise de tout numéro de port UDP.
Coder en dur le numéro de port UDP est une mauvaise idée, car il peut être utilisé par une autre application en cours d'exécution sur le même PC.
Est-il un moyen de lier une socket UDP vers n'importe quel port disponible? OMI, il devrait être un moyen efficace pour obtenir rapidement un port libre #, qui est utilisé par exemple par accept() de la fonction.
Si non, quelle est la meilleure stratégie pour essayer de liaison et de vérifier WSAEADDRINUSE/EADDRINUSE statut: essayez les ports de l'ordre, en commençant à partir de 1025, ou 1025+rand(), ou de quelques autres?
- accept() est utilisé dans le cadre de culots, pas de datagramme ceux.
- peut-être que ce sera vous aider: serverfault.com/questions/447044
- Dans POSIX? Aussi exigeant gamme 1024+ : stackoverflow.com/questions/913501/...
Vous devez vous connecter pour publier un commentaire.
Appel
sendto
sans appelbind
tout d'abord, le support sera lié automatiquement (à un port libre).bind()
appel. Pas seulement pour Windows.Est une autre option pour spécifier le port 0 à
bind()
. Qui vous permettra de lier à une adresse IP spécifique (dans le cas où vous avez plusieurs installé) tout en se liant à un port aléatoire. Si vous avez besoin de savoir sur quel port a été choisi, vous pouvez utilisergetsockname()
après la reliure a été réalisée.bind()
documentation: "si le port est spécifié en tant que zéro, le fournisseur d'accès attribue un port unique pour l'application de la plage de ports dynamiques client. Sur Windows Vista et les versions ultérieures, la plage de ports dynamiques client est une valeur comprise entre 49152 et 65535. C'est un changement à partir de Windows Server 2003 et versions antérieures, où la plage de ports dynamiques client a une valeur comprise entre 1025 et 5000... L'application peut utiliser getsockname après l'appel de se lier à savoir l'adresse et le port qui a été attribué à la prise."Windows
etWinSock
, c'est pourquoi j'ai cité la documentation de Microsoft. Autant que je sache, la liaison sur le port 0 est documenté dans l'4.2 BSD standard, plate-forme de mise en œuvre est basée sur.Je dois manquer quelque chose, pourquoi n'utilisez-vous pas le socket udp pour envoyer des données en retour?
Commencez avec sendto et ensuite utiliser la fonction recvfrom pour lire les données entrantes aussi, vous obtenez un bonus de l'adresse à partir de laquelle les données ont été envoyées, juste là pour vous d'envoyer une réponse en retour.
sendto
sera implicitement sélectionnez un port source, mais il y a peut être d'autres protocoles où vous faites attention à ce que le numéro de port avant de vous fairesendto
.