2010-08-20 13 views
5

Mi aplicación tiene un socket de servidor asio que debe aceptar conexiones de una lista definida de direcciones IP.boost :: asio async_accept Rechazar una conexión

Este filtro debe ser realizada por la aplicación, (no por el sistema), ya que puede cambiar en cualquier momento (i debe ser capaz de actualizar esta lista en cualquier momento)

el cliente debe recibir una acces_denied error.

Supongo que cuando se llama a call_accept callback, SYN/ACK ya se ha enviado, por lo que no quiero aceptar y luego cerrar brutalmente cuando detecto que la conexión IP no está permitida. No administro el comportamiento del cliente, quizás no actúa igual cuando la conexión se rechaza y simplemente se cierra por pares, por lo que quiero hacer todo limpio. (pero es lo que estoy pensando por el momento)

¿Sabes cómo puedo hacer eso?

Mi lista de acceso es un contenedor de std :: cadenas (pero puedo convertirlo en un countainer de otra cosa ....)

Muchas gracias

+0

Creo que no se puede hacer usando ASIO – gomons

Respuesta

4

El método async_accept tiene una sobrecarga para obtener el punto extremo par Puede comparar ese valor dentro de su controlador async_accept. Si no coincide con una entrada en su contenedor, deje que el socket quede fuera del alcance. De lo contrario, trátelo según lo requiera tu aplicación.

0

No conozco los detalles de su aplicación, pero así es como lo haría.

En el controlador de aceptar/lambda

void onAccept(shared_ptr<connection> c, error_code ec) 
{ 
    if (ec) { /*... */ } 
    if (isOnBlackList(c->endpoint_)) 
    { 
     c->socket_.async_write(/* a refusal message */, 
     [c](error_code, n) 
     { 
      c->socket_.shutdown(); 
      // c fizzles out of all contexts... 
     }); 
    } 
    else 
    { 
     // successful connection execution path 
    } 
} 
Cuestiones relacionadas