boost::asio : trouver un port libre ?

boost::asio : trouver un port libre ? - C++ - Programmation

Marsh Posté le 13-11-2009 à 01:32:10    

Je cherche une solution pour trouver un port libre sur une machine (et ouvrir une socket dessus)
Il y a la possibilité de faire un try..catch en essayant d'ouvrir une socket sur une liste de port, mais je trouve ca super crade.
 
Et mes recherches sur google ne m'ont rien donné. J'aimerai trouver une solution à travers boost, mais si c'est pas possible simplement tant pis.
 
Merci !


---------------
Un blog qu'il est bien
Reply

Marsh Posté le 13-11-2009 à 01:32:10   

Reply

Marsh Posté le 13-11-2009 à 18:26:14    

J'ai une solution qui semble fonctionner, perso je trouve ca laid :
 

Code :
  1. unsigned short connectionMngr::getAvailablePort() const throw (connectionMngrException)
  2. {
  3.   boost::asio::io_service io_service;
  4.   udp::socket *socket = 0;
  5.   unsigned short testPort = 1024;   //start for non-root access :-)
  6.   bool error = false, opened = false;
  7.   while( testPort < 65000 && opened == false )
  8.   {
  9.     try
  10.     {
  11.       socket = new udp::socket(io_service, udp::endpoint(udp::v6(), testPort));
  12.     } catch( ... )  //anything !
  13.     {
  14.       if( socket != 0 )
  15.         delete socket;
  16.       error = true;
  17.     }
  18.     if( error == true )
  19.     {
  20.       ++testPort;
  21.       error = false;
  22.     }
  23.     else
  24.       opened = true;
  25.   }
  26.   if( opened == true ) //port ok, close socket
  27.   {
  28.     socket->close();
  29.     delete socket;
  30.   }
  31.   else   //no port available ! Wow !!
  32.   {
  33.     ostringstream oss;
  34.     oss<<"connectionMngr::getAvailablePort No available port found for handling connection !";
  35.     throw connectionMngrException( oss.str() );
  36.   }
  37.   return testPort;
  38. }


---------------
Un blog qu'il est bien
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed