在 beast 1.70.0 中使用 Tcp 超时
Using Tcp timeout in beast 1.70.0
我刚刚将 boost 库从 1.68.0
更新到 1.70.0
以获得 (beast) websocket ssl client async example 中的超时操作。
在上面link你会看到:
void
on_resolve(
beast::error_code ec,
tcp::resolver::results_type results)
{
if(ec)
return fail(ec, "resolve");
// Set a timeout on the operation
beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
// Make the connection on the IP address we get from a lookup
beast::get_lowest_layer(ws_).async_connect(
results,
beast::bind_front_handler(
&session::on_connect,
shared_from_this()));
}
有不止一个函数在超时时使用了这个结构。对于我的代码(在 eclipse-cdt 中,我是这样看的
错误说(当鼠标指针悬停在 expires_after 或 async_connect 上时):
Method 'expires_after' could not be resolved
OR
Method 'async_connect' could not be resolved
当鼠标指针移到 "get_lowest_layer" 上时,错误提示
Invalid arguments '
Candidates are:
boost::beast::detail::lowest_layer_type_impl<#0,bool74 0 value 43 8 2 201 2
boost::beast::detail::has_next_layer_impl
boost::beast::detail::has_next_layer_impl 1 #0 0 71 4417 0 0>::type & get_lowest_layer(#0 &)
'
我想知道为此我需要 link 一些库。我不知道是哪一个。
有什么建议吗?
这与so库无关。
boost::beast是模板库,所以没有共享库。
您的编辑器使用定义而不是链接来显示此 IDE 错误。基本上你的编辑器找不到你指向的headers。
如果我不得不猜测,您已经手动编译了 boost 以使用 boost::beast,因为它在大多数现代 Linux 发行版中不可用。或者您可能没有使用 Linux。该示例有一些包含,而您的 IDE 无法解析它们,因为它们不在您的系统包含 (/usr/include
) 中。所以,它不知道去哪里找。
因此,总而言之,您的构建系统没有与您的 IDE 正确耦合。
要解决此问题,请尝试了解您的 IDE 如何解决丢失的 headers。添加具有提升 headers 的包含路径。
我已经通过将超时设置为
解决了我的代码中的问题(使用 beast 1.70.0
)
void
on_resolve(
beast::error_code ec,
tcp::resolver::results_type results)
{
if(ec)
return fail(ec, "resolve");
// Set a timeout on the operation
ws_.next_layer().expires_after(std::chrono::seconds(30));
// Make the connection on the IP address we get from a lookup
ws_.next_layer().async_connect(
results,
beast::bind_front_handler(
&session::on_connect,
shared_from_this()));
}
我也对我的代码进行了一些更改(beast 1.68.0
)如下
void Foo::closetimer_websocket(beast::error_code ec) {
if (ec.message() == "Success") {
ioc.stop();
}
}
// closetimer_websocket is the member of class Foo. And FooObject is its instance
void session::SetAsyncOpTimeoutInSec(unsigned int time_inSeconds) {
TcpTimer.expires_from_now((boost::posix_time::seconds(time_inSeconds)));
TcpTimer.async_wait(bind(&Foo::closetimer_websocket, FooObject, placeholders::_1));
}
void session::on_resolve(beast::error_code ec,
tcp::resolver::results_type results) {
if(ec)
return fail(ec, "resolve");
//Set the timeout
SetAsyncOpTimeoutInSec(5);
// Make the connection on the IP address we get from a lookup
net::async_connect(ws_.next_layer().next_layer(), results.begin(),
results.end(),
bind(&session::on_connect, shared_from_this(), placeholders::_1));
}
我刚刚将 boost 库从 1.68.0
更新到 1.70.0
以获得 (beast) websocket ssl client async example 中的超时操作。
在上面link你会看到:
void
on_resolve(
beast::error_code ec,
tcp::resolver::results_type results)
{
if(ec)
return fail(ec, "resolve");
// Set a timeout on the operation
beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
// Make the connection on the IP address we get from a lookup
beast::get_lowest_layer(ws_).async_connect(
results,
beast::bind_front_handler(
&session::on_connect,
shared_from_this()));
}
有不止一个函数在超时时使用了这个结构。对于我的代码(在 eclipse-cdt 中,我是这样看的
错误说(当鼠标指针悬停在 expires_after 或 async_connect 上时):
Method 'expires_after' could not be resolved
OR
Method 'async_connect' could not be resolved
当鼠标指针移到 "get_lowest_layer" 上时,错误提示
Invalid arguments '
Candidates are:
boost::beast::detail::lowest_layer_type_impl<#0,bool74 0 value 43 8 2 201 2
boost::beast::detail::has_next_layer_impl
boost::beast::detail::has_next_layer_impl 1 #0 0 71 4417 0 0>::type & get_lowest_layer(#0 &) '
我想知道为此我需要 link 一些库。我不知道是哪一个。 有什么建议吗?
这与so库无关。
boost::beast是模板库,所以没有共享库。
您的编辑器使用定义而不是链接来显示此 IDE 错误。基本上你的编辑器找不到你指向的headers。
如果我不得不猜测,您已经手动编译了 boost 以使用 boost::beast,因为它在大多数现代 Linux 发行版中不可用。或者您可能没有使用 Linux。该示例有一些包含,而您的 IDE 无法解析它们,因为它们不在您的系统包含 (/usr/include
) 中。所以,它不知道去哪里找。
因此,总而言之,您的构建系统没有与您的 IDE 正确耦合。
要解决此问题,请尝试了解您的 IDE 如何解决丢失的 headers。添加具有提升 headers 的包含路径。
我已经通过将超时设置为
解决了我的代码中的问题(使用beast 1.70.0
)
void
on_resolve(
beast::error_code ec,
tcp::resolver::results_type results)
{
if(ec)
return fail(ec, "resolve");
// Set a timeout on the operation
ws_.next_layer().expires_after(std::chrono::seconds(30));
// Make the connection on the IP address we get from a lookup
ws_.next_layer().async_connect(
results,
beast::bind_front_handler(
&session::on_connect,
shared_from_this()));
}
我也对我的代码进行了一些更改(beast 1.68.0
)如下
void Foo::closetimer_websocket(beast::error_code ec) {
if (ec.message() == "Success") {
ioc.stop();
}
}
// closetimer_websocket is the member of class Foo. And FooObject is its instance
void session::SetAsyncOpTimeoutInSec(unsigned int time_inSeconds) {
TcpTimer.expires_from_now((boost::posix_time::seconds(time_inSeconds)));
TcpTimer.async_wait(bind(&Foo::closetimer_websocket, FooObject, placeholders::_1));
}
void session::on_resolve(beast::error_code ec,
tcp::resolver::results_type results) {
if(ec)
return fail(ec, "resolve");
//Set the timeout
SetAsyncOpTimeoutInSec(5);
// Make the connection on the IP address we get from a lookup
net::async_connect(ws_.next_layer().next_layer(), results.begin(),
results.end(),
bind(&session::on_connect, shared_from_this(), placeholders::_1));
}