2012-12-05 8 views
8
numaralı

numaralı bağlantı noktasını bulmak için taşınabilir bir yol var Şu anda bağlantı kurmak için boş bir bağlantı noktasının numarasını bulmanın bir yolunu bulmaya çalışıyorum, ideal olarak, boost :: asio. Bu port numarası daha sonra dinlemek için kullanılacaktır (ve sadece bir soket açabilirim).Boost :: asio,

Kabaca, liman boş bırakılır

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

yapmak için bir yol yoktur (çalışmıyor 0 olarak ayarlamak)

önce görülen seçeneklerden

Yok taşınabilir veya etkili .

cevap

9

Bunu işlemenin en iyi yolu, işletim sisteminin soketin bir bağlantı noktasına bağlandığı anda rastgele kullanılabilir bir bağlantı noktası seçmesine izin vermektir. Sokete port 0'a bağlanmasını söyleyin, ardından başarılı ise bağlı olduğu gerçek port için soketi sorgulayın. Zamanın önünde bir liman bulmaya çalışmayın ve ona bağlanın, bu bir yarış durumu ortaya çıkarır. Başka bir soket, onu bulduktan sonra onu bağlayabilmeniz için limana girebilir.

+0

Bu benim ilk hedefimdi, ancak sadece 0'dan geçiyor – user1018513

+0

sorusunda belirtildiği gibi işe yaramamak için: sayım << endpoint.port() << endl; cout << endpoint.address(). To_string() << endl; 0 ve localhost adresini döndür. Bu uri reklamını yapabilmem gerekiyor ve bu nedenle – user1018513

+0

port numarasını tam olarak bilmek zorundasınız? Lütfen gerçek kodunuzu gösterin. –