Comment trouver un socket du numéro de port local? (Windows C++)
Je suis nouveau sur réseau sous Windows, et j'essaie de trouver quel numéro de PORT mon socket est lié à (C++, Windows 7, Visual Studio 2010 Professional). C'est un socket UDP, et de ce que je comprends, à l'aide de l'installation initiale suivante doit le lier à un hasard de port disponible/adresse:
sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = 0; //randomly selected port
int result = bind(clientSock, (sockaddr*)&local, sizeof(local));
//result is always 0
Aussi loin que l'utilisation de cette méthode, elle fonctionne pour l'envoi de données ou de la lier à un port spécifique (en remplaçant le 0 avec une numéro de port). Ce dont j'ai besoin est de le lier au hasard, puis de trouver le port avec lequel il était lié par la suite. Est il possible que je puisse faire cela? Il semble que le "local" struct contient "0.0.0.0", comme l'adresse IP et le "0" comme le numéro de PORT.
Merci pour toute aide! Je l'apprécie.
re: pourquoi ne pas générer un port aléatoire -- parce que c'port aléatoire peut-être déjà en cours d'utilisation par un autre programme ou d'un service.
OriginalL'auteur Sefu | 2011-07-12
Vous devez vous connecter pour publier un commentaire.
Utilisation
getsockname
. Par exemple:Cela fonctionne aussi pour les *nix-en fonction des systèmes, mais notez que certains systèmes de définir le troisième argument de
getsockname
pour être de typesocklen_t*
au lieu deint*
, de sorte que vous pourriez obtenir des avertissements sur les pointeurs différents dans ce paramètre si vous êtes à la rédaction de la croix-plate-forme de code.Merci, qu'il a fait pour moi. J'apprécie votre aide.
OriginalL'auteur Adam Rosenfield
getsockname peut l'obtenir pour vous, mais je me demande pourquoi votre code fonctionne avec un socket UDP.
"bind() fonctionne très bien avec les sockets UDP" -- bien sûr.".sin_port = 0; //port sélectionné de manière aléatoire" -- MSDN seuls les documents pour le protocole TCP.
MSDN documents dans SendTo qu'il s'auto-Lier pour UDP, si vous ne l'avez pas déjà.
la documentation MSDN pour
sendto()
états implicitebind()
est effectuée uniquement si lesetsockopt()
a également été appelé à l'avance.OriginalL'auteur Windows programmer