Я поддерживаю устаревшее многопоточное приложение, содержащее tcp-серверы и клиентов. Вызовы открытия, закрытия и т. Д. Поступают из другого потока.
Каждый tcp-сервер / клиент имеет элемент сокета в shared_ptr для простого воссоздания сокета при переподключении:
m_strand.dispatch([this, iter]() {
m_socket.reset(new boost::asio::ip::tcp::socket(m_ioService));
m_socket->async_connect(iter->endpoint(), boost::bind(&Client::onConnect, this, boost::asio::placeholders::error));
});
У них также есть элемент стренги для обеспечения одновременного вызова обработчиков чтения / записи и т. Д .:
m_strand.dispatch([this]() {
if (m_socket) {
boost::system::error_code ec;
m_socket->cancel(ec);
m_socket->shutdown(boost::asio::socket_base::shutdown_both, ec);
m_socket->close(ec);
}});
Однако отправка (и запись) переносятся следующим образом:
m_socket->async_send(
boost::asio::buffer(buffer->str(), buffer->len() + 1),
m_strand.wrap(boost::bind(&Client::onSend, this, boost::asio::placeholders::error, bufferIdx)));
Вопрос(1): Может ли это случиться так, что при вызове этого Client :: onSend m_socket теперь является «воссозданным» из более раннего метода повторного подключения, и если да, это будет проблемой (m_socket не используется в Client ::обработчик onSend)?
К сожалению, прослушивающая часть tcp-сервера выполняется из внешнего класса, который обращается к сокету и цепи через член:
Server *srv = ...
m_acceptor.async_accept(
*srv->socket(),
srv->strand().wrap(boost::bind(&Listener::onAccept, this, ctx, boost::asio::placeholders::error)));
Вопрос (2):это та же самая ситуация, что и в вопросе (1), где вызов onAccept может быть рискованным, если сокет воссоздан между ними, или это может быть дополнительной проблемой при передаче сокета viпрямая ссылка?
Заранее спасибо!