2010-08-20 2 views
5

В моем приложении есть сокет-сервер asio, который должен принимать соединения из определенного списка IP-адресов.boost :: asio async_accept Отказать в подключении

Этот фильтр должен быть сделано с помощью приложения (не система), так как она может измениться в любой момент (я должен иметь возможность обновлять этот список в любое время)

Клиент должен получить acces_denied ошибка.

Я предполагаю, что когда вызывается обратный вызов handle_accept, SYN/ACK уже отправлен, поэтому не хотите принимать, затем закрыть жестоко, когда я обнаруживаю, что связанный ip-адрес не разрешен. Я не управляю поведением клиента, возможно, он не действует одинаково, когда соединение отказывается и просто закрывается одноранговым узлом, поэтому я хочу сделать все чистым. (но это то, что im iming на данный момент)

Вы знаете, как я могу это сделать ???

Мой список доступа представляет собой контейнер STD :: строки (но я могу преобразовать его в countainer чего-то еще ....)

Большое спасибо

+0

Я думаю, что вы не можете сделать это с помощью ASIO – gomons

ответ

4

Метод async_accept имеет перегрузку для получения конечной точки сверстника. Вы можете сравнить это значение внутри вашего обработчика async_accept. Если он не соответствует записи в вашем контейнере, разрешите сокет выйти из области видимости. В противном случае обрабатывайте его по мере необходимости.

0

Я не знаю подробностей вашего приложения, но это то, как я это сделаю.

В обработчике Accept/лямбда

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 
    } 
} 
Смежные вопросы