设置提升超时 socket.connect
Set timeout for boost socket.connect
我在 tcp::socket
上使用 boost::asio::connect
。当一切顺利时,connect
returns 立即但在网络不佳时,connect
在日志等待 15 秒后超时。我不能等那么久,所以想减少超时。不幸的是,到目前为止我还没有遇到任何解决方案。
我看到 async_wait 与 deadline_timer 一起使用的解决方案,但所有这些示例都是针对接收/发送操作而不是针对连接。
谁能帮我提供 boost::asio::connect(socket, endpoints);
的示例代码。要求是它应该在 5 秒而不是 15 秒内超时。
你看过下面的example吗?它包含一个带有超时的示例代码 async_connect
。
连接超时方法可以使用以下代码实现:
void connect(const std::string& host, const std::string& service,
boost::posix_time::time_duration timeout) {
// Resolve the host name and service to a list of endpoints.
tcp::resolver::query query(host, service);
tcp::resolver::iterator iter = tcp::resolver(io_service_).resolve(query);
// Set a deadline for the asynchronous operation. As a host name may
// resolve to multiple endpoints, this function uses the composed operation
// async_connect. The deadline applies to the entire operation, rather than
// individual connection attempts.
deadline_.expires_from_now(timeout);
// Set up the variable that receives the result of the asynchronous
// operation. The error code is set to would_block to signal that the
// operation is incomplete. Asio guarantees that its asynchronous
// operations will never fail with would_block, so any other value in
// ec indicates completion.
boost::system::error_code ec = boost::asio::error::would_block;
// Start the asynchronous operation itself. The boost::lambda function
// object is used as a callback and will update the ec variable when the
// operation completes. The blocking_udp_client.cpp example shows how you
// can use boost::bind rather than boost::lambda.
boost::asio::async_connect(socket_, iter, var(ec) = _1);
// Block until the asynchronous operation has completed.
do io_service_.run_one(); while (ec == boost::asio::error::would_block);
// Determine whether a connection was successfully established. The
// deadline actor may have had a chance to run and close our socket, even
// though the connect operation notionally succeeded. Therefore we must
// check whether the socket is still open before deciding if we succeeded
// or failed.
if (ec || !socket_.is_open())
throw boost::system::system_error(
ec ? ec : boost::asio::error::operation_aborted);
}
我在 tcp::socket
上使用 boost::asio::connect
。当一切顺利时,connect
returns 立即但在网络不佳时,connect
在日志等待 15 秒后超时。我不能等那么久,所以想减少超时。不幸的是,到目前为止我还没有遇到任何解决方案。
我看到 async_wait 与 deadline_timer 一起使用的解决方案,但所有这些示例都是针对接收/发送操作而不是针对连接。
谁能帮我提供 boost::asio::connect(socket, endpoints);
的示例代码。要求是它应该在 5 秒而不是 15 秒内超时。
你看过下面的example吗?它包含一个带有超时的示例代码 async_connect
。
连接超时方法可以使用以下代码实现:
void connect(const std::string& host, const std::string& service,
boost::posix_time::time_duration timeout) {
// Resolve the host name and service to a list of endpoints.
tcp::resolver::query query(host, service);
tcp::resolver::iterator iter = tcp::resolver(io_service_).resolve(query);
// Set a deadline for the asynchronous operation. As a host name may
// resolve to multiple endpoints, this function uses the composed operation
// async_connect. The deadline applies to the entire operation, rather than
// individual connection attempts.
deadline_.expires_from_now(timeout);
// Set up the variable that receives the result of the asynchronous
// operation. The error code is set to would_block to signal that the
// operation is incomplete. Asio guarantees that its asynchronous
// operations will never fail with would_block, so any other value in
// ec indicates completion.
boost::system::error_code ec = boost::asio::error::would_block;
// Start the asynchronous operation itself. The boost::lambda function
// object is used as a callback and will update the ec variable when the
// operation completes. The blocking_udp_client.cpp example shows how you
// can use boost::bind rather than boost::lambda.
boost::asio::async_connect(socket_, iter, var(ec) = _1);
// Block until the asynchronous operation has completed.
do io_service_.run_one(); while (ec == boost::asio::error::would_block);
// Determine whether a connection was successfully established. The
// deadline actor may have had a chance to run and close our socket, even
// though the connect operation notionally succeeded. Therefore we must
// check whether the socket is still open before deciding if we succeeded
// or failed.
if (ec || !socket_.is_open())
throw boost::system::system_error(
ec ? ec : boost::asio::error::operation_aborted);
}