2009-02-23 16 views
5

es un poco extraño para mí que boost.asio no utilice un concepto básico cuando la aplicación del cliente se conecta al servidor, usando la dirección IP y el puerto. Puede ser que sea un poco novato en Boost, y lo acepto, pero de todos modos no entiendo.
lo tanto, tengo un código como este para obtener cliente conectado al servidor en el host local:¿Cómo boost.asio descubre en qué puerto está escuchando mi aplicación de servidor?


     boost::asio::io_service io_service; 
     tcp::resolver resolver(io_service); 
     tcp::resolver::query query("localhost", "daytime"); 
     tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
     tcp::resolver::iterator end; 

     tcp::socket socket(io_service); 
     boost::system::error_code error = boost::asio::error::host_not_found; 
     while(error && endpoint_iterator != end) { 
      socket.close(); 
      socket.connect(*endpoint_iterator++, error); 
     } 

de Windows en su WinSock 2.0 utiliza dos parámetros - IP y el puerto - para identificar el servidor.
Entonces, la cotización es: ¿cómo exactamente Asio descubre en qué puerto está escuchando el servidor las conexiones? ¿Escanea todos los puertos? Y, si lo hace, ¿qué sucederá si dos servidores están escuchando en diferentes puertos al mismo tiempo?

Respuesta

5

Le está diciendo que desea conectarse a localhost en el puerto utilizado por el servicio diurno. Buscará el número de puerto apropiado en el archivo de servicios (normalmente C: \ WINDOWS \ system32 \ drivers \ etc \ services en Windows, creo que/etc/services en Unix). También podría usar un número de puerto explícito allí.

+0

No entendí muy bien qué significa el segundo parámetro en query ctor. la primera es la dirección IP a la que me quiero conectar, ¿verdad? y ¿qué significa el segundo? – chester89

+0

El segundo parámetro es un número de puerto o el nombre de un servicio. Si se trata de un nombre de servicio, asio lo buscará en el archivo de servicios para encontrar el número de puerto apropiado para ese servicio. Eche un vistazo al archivo de servicios con un editor de texto y verá cómo funciona. – Ferruccio

+0

bien, entonces ¿cómo puedo iniciar un servidor en un puerto que necesito? el código para eso en el lado del servidor es: boost :: asio :: io_service io_service; tcp :: aceptor acceptor (io_service, tcp :: endpoint (tcp :: v4(), 13)); – chester89

8

intento,

tcp::resolver::query query("localhost", boost::lexical_cast<string>(port));//assuming port is an int 

Para responder a su pregunta, recordemos que está iniciando el servidor en el puerto 13. Esto pasa a ser el puerto que se ejecuta el servicio diurno Linux (http://www.sorgonet.com/linux/linuxdaemons/). Por lo tanto, posteriormente pueden usar la consulta ("localhost", "daytime") en lugar de especificar el puerto.

0

netcat abierto escuche en el puerto 13 en el localhost aceptará la conexión de la demostración. escriba algunos blabla cuando se conecta y verá el resultado en el programa de demostración para ejecutar netcat, ejecute: nc -l 13p12

windows? sin netcat? instalar cygwin, y agregar netcat

Cuestiones relacionadas