Merge sync and async Connect() to deduplicate code

This commit is contained in:
Alexander A. Klimov 2024-01-25 13:19:31 +01:00
parent 6c03598678
commit 86a20d4916

View File

@ -36,20 +36,25 @@ public:
* @ingroup base
*/
template<class Socket>
void Connect(Socket& socket, const String& node, const String& service)
void Connect(Socket& socket, const String& node, const String& service, boost::asio::yield_context* yc)
{
using boost::asio::ip::tcp;
tcp::resolver resolver (IoEngine::Get().GetIoContext());
tcp::resolver::query query (node, service);
auto result (resolver.resolve(query));
auto result (yc ? resolver.async_resolve(query, *yc) : resolver.resolve(query));
auto current (result.begin());
for (;;) {
try {
socket.open(current->endpoint().protocol());
socket.set_option(tcp::socket::keep_alive(true));
socket.connect(current->endpoint());
if (yc) {
socket.async_connect(current->endpoint(), *yc);
} else {
socket.connect(current->endpoint());
}
break;
} catch (const std::exception& ex) {
@ -67,34 +72,15 @@ void Connect(Socket& socket, const String& node, const String& service)
}
template<class Socket>
void Connect(Socket& socket, const String& node, const String& service, boost::asio::yield_context yc)
inline void Connect(Socket& socket, const String& node, const String& service)
{
using boost::asio::ip::tcp;
Connect(socket, node, service, nullptr);
}
tcp::resolver resolver (IoEngine::Get().GetIoContext());
tcp::resolver::query query (node, service);
auto result (resolver.async_resolve(query, yc));
auto current (result.begin());
for (;;) {
try {
socket.open(current->endpoint().protocol());
socket.set_option(tcp::socket::keep_alive(true));
socket.async_connect(current->endpoint(), yc);
break;
} catch (const std::exception& ex) {
auto se (dynamic_cast<const boost::system::system_error*>(&ex));
if (se && se->code() == boost::asio::error::operation_aborted || ++current == result.end()) {
throw;
}
if (socket.is_open()) {
socket.close();
}
}
}
template<class Socket>
inline void Connect(Socket& socket, const String& node, const String& service, boost::asio::yield_context yc)
{
Connect(socket, node, service, &yc);
}
}