Comment puis-je obtenir gratuitement un port socket? C++
Je suis en train d'écrire un test UDP client/serveur et je veux le faire à travers le pare-feu. Soi-disant tout ce que je dois faire est d'avoir les deux côtés de l'envoyer à la bonne IP et le serveur. Obtenir une IP n'est pas un problème, mais comment puis-je demander au client de choisir aléatoirement gratuit port et de signaler à l'utilisateur? J'ai finalement souhaitez vous connecter à un entremetteur serveur mais pour l'instant, j'ai besoin d'un simple prototype de travail et je voudrais cout le numéro de port pour mon ami/testeur peut m'envoyer le # via la messagerie instantanée afin que nous puissions tester.
Comment puis-je obtenir le numéro de port?
désolé pour le long desc. Je remarque que les gens me disent de ne pas faire ce que je demande quand je ne donne pas une desc 🙁
OriginalL'auteur | 2009-04-29
Vous devez vous connecter pour publier un commentaire.
À utiliser le terme très technique, c'est vraiment dégueulasse problème ou même une paire de icky problèmes. Selon la configuration du pare-feu, il permet généralement d'obtenir des réponses à partir d'un autre point de terminaison sur le point de terminaison IP que la demande venait de. ... Donc si vous en ami reçoit le datagramme UDP en utilisant quelque chose comme la
recvfrom()
appel système, le paramètre d'adresse recevrez l'adresse IP du point de terminaison de répondre. Ainsi, l'autre doit être en mesure de répondre avec unsendto()
en utilisant les mêmes informations d'adressage. Quelque chose comme:La
peeraddr
sur l'autre côté sera votre externe adresse ou, plus correctement, l'adresse IP de votre pare-feu et le numéro de port qu'il a choisi d'utiliser. Le numéro de port que vous spécifiez dans votre code peut être complètement différente que le port que votre ami aurait pour envoyer des données. En fin de compte, il pourrait ne pas d'importance ce port que vous choisissez d'utiliser depuis le pare-feu peut être l'envoi et la réception sur un port différent - c'est ce que La Traduction D'Adresses Réseau est tout au sujet. Je vous recommande de lire RFC3235 pour quelques conseils sur la façon de surmonter cet obstacle.La meilleure approche à mon humble avis est de:
bind()
avec un zéro ou de numéro de port de sauter le lier au totalrecvfrom()
)Bien sûr, toute la magie est dans la dernière étape. Si vous pouvez désactiver le NAT ou de s'assurer que le pare-feu ne va jamais à les ports de commutateur, puis clouer un numéro de port et
bind
-ing, il fonctionnera aussi bien. Vous voudrez peut-être jeter un oeil à%WINDIR%\system32\drivers\etc\services
(ou/etc/services
selon votre système d'exploitation inclinaison) pour avoir une idée de ce que les numéros de port sont réservés ou plus généralement en usage.OriginalL'auteur D.Shawley
Généralement - vous - en tant que développeur - choisir le port. Vous pouvez configurer votre application pour lire le port à partir d'un fichier de configuration ou la saisie de l'utilisateur - mais pas de magie pare-feu va vous dire ce port à utiliser...
OriginalL'auteur Shane C. Mason
Si je comprends votre question correctement, je ne suis pas sûr qu'il y a un moyen de faire ce que vous voulez par programmation (et même s'il y est, je ne pense pas que c'est la bonne approche). Je pense que vous avez besoin de trouver un port qui n'est pas en cours d'utilisation sur la machine serveur (et peut-être un autre ou le même port sur la machine du client, si la communication est bi-directionnelle) ET que le port doit être en mesure de passer à travers votre pare-feu. Je suppose puisque vous dites "obtenir une adresse IP n'est pas un problème", vous avez déjà configuré votre pare-feu pour certains ou tous les ports d'un ordinateur spécifique à l'intérieur du pare-feu? Si oui, le port que vous cherchez est un de ceux que vous a transmis. Vous pouvez juste choisir arbitraire, tant qu'aucun autre service est en cours d'exécution sur ce port. Les Ports inférieurs à 1024 sont réservés, alors vous voudrez probablement choisir un nombre plus élevé que cela. Vous pouvez utiliser un simple portscanning outil tel que nmap pour voir quels services sont en cours d'exécution sur votre ordinateur, les ports et d'en choisir une autre. Notez que
nmap
peut être dupé par des pare-feu et diversbind
règles lorsque les sockets sont créés.OriginalL'auteur rmeador
Je pense que vous feriez mieux de choisir un port fixe plutôt que de s'appuyer sur le numéro de port aléatoire choisi par l'O/S.
Si vous utilisez un port aléatoire vous devez modifier vos paramètres de pare-feu à chaque fois que vous exécutez le programme.
OriginalL'auteur Alnitak
Si vous êtes en utilisant WINSOCK vérifier ce lien:
http://msdn.microsoft.com/en-us/library/aa280717(SV.60).aspx
Fondamentalement, vous avez 2 choix définissez le port 0 et de laisser le système vous attribuer un ou choisi un au hasard essayez d'ouvrir le socket si cela ne fonctionne pas, essayez un autre (assurez-vous d'orienter clairement de ports réservés)
OriginalL'auteur SpaceghostAli
bind() de la douille avant de vous envoyer vos données. Spécifiez le port 0 de bind(), et le système d'exploitation choisir un port inutilisé pour vous. Vous pouvez ensuite utiliser getsockname() pour savoir sur quel port de l'asm choisi.
OriginalL'auteur Remy Lebeau