2012-12-05 9 views
8

Obecnie próbuję znaleźć sposób na znalezienie numeru wolnego portu do ustanowienia połączenia, najlepiej z boost :: asio. Ten numer portu byłby następnie używany do nasłuchu (i tylko wtedy można otworzyć gniazdo).Używanie boost :: asio jest przenośnym sposobem na znalezienie darmowego numeru portu

grubsza, czy istnieje sposób, aby zrobić

tcp::resolver::query query("localhost", port); 

gdzie port jest puste (ustawienie go na 0 nie działa)

Żadna z opcji nie widziałem wcześniej były przenośne, lub efektywny .

Odpowiedz

9

Najlepszym sposobem radzenia sobie z tym jest umożliwienie systemowi wybrania losowego portu dostępnego w chwili podłączenia gniazda do portu. Powiedz gniazdu, aby powiązał port 0, a następnie zapytaj gniazdo o rzeczywisty port, z którym się wiąże, jeśli się powiedzie. Nie próbuj znaleźć portu z wyprzedzeniem, a następnie powiązać go, co wprowadza stan wyścigu. Inne gniazdo może odciąć port po znalezieniu go, ale zanim będzie można go związać.

+0

To był mój pierwszy cel, ale zwykłe podanie 0 nie działa, jak podano w pytaniu: – user1018513

+0

Aby wyjaśnić: count << endpoint.port() << endl; cout << endpoint.address(). To_string() << endl; Powrót 0 i adres localhost. Muszę być w stanie zareklamować to URI i dlatego muszę znać dokładny numer portu – user1018513

+0

w jaki sposób inicjujesz/uzyskujesz 'punkt końcowy'? Proszę pokazać swój faktyczny kod. –