boost :: asio async_accept отклонить соединение - PullRequest
6 голосов
/ 20 августа 2010

Мое приложение имеет сокет-сервер asio, который должен принимать соединения из определенного списка IP-адресов.

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

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 20 августа 2010

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

0 голосов
/ 23 июня 2017

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

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

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
    }
}
...