Я написал программу TCP / IP, в которой клиент использует обычный (не Boost) API сокетов;т.е. сервер связывает и слушает, а клиент подключается.Сервер использует pthreads для обработки нескольких клиентов одновременно.
Программа использует OpenSSL для обмена ключами сеанса между клиентом и сервером.
Позже я заметил, что периодически мне нужно выполнять«Повторный ключ»: после того, как сеанс установлен, я должен запланировать задачу повторного ключа, в которой клиент и сервер согласовывают новый ключ сеанса.
Один вариант заключался в создании новогопоток для каждого клиента: новый поток будет находиться в режиме ожидания в течение некоторого времени, а затем пробуждается и инициирует повторное нажатие.Этот вариант довольно дорогой, поскольку каждый клиент должен быть многопоточным.
Другой вариант заключался в использовании Boost Asio.Я сожалею, что не знал, что эта ценная библиотека существовала;в противном случае я бы закодировал программу, используя потоки Boost и сокеты Boost.
В любом случае, я хочу выполнить работу с минимальными изменениями.Сначала я неправильно понял Asio.Используя пример Boost's Timer 2 , я написал что-то вроде этого:
void rekey(const boost::system::error_code& /*e*/)
{
// do rekey
}
...
void main()
{
//connect to server
// schedule re-key
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::minutes(30));
t.async_wait(rekey);
io.run();
// the rest of job (i.e. sending and receiving messages in a while() loop.)
}
Это явно неправильно, так как Boost блокирует на io.run()
.Мое первое восприятие состояло в том, что асинхронная природа async_wait
решит проблему, но, очевидно, я неправильно понял модель Asio.
Я имею в виду два решения:
- Генерация функциив котором выполняется отправка и получение (с использованием обычного API сокета), и добавьте эту функцию в очередь объекта
io
, чтобы io.run()
работал как положено. - Переписать функции сокета с помощью Boost'sAPI асинхронного сокета.
Есть ли лучшее решение?В любом случае, не могли бы вы помочь мне понять, как реализовать лучшее решение?