首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确的set_socket_init_handler语法或修改源代码以打开带有websocket++的TCP_NODELAY

正确的set_socket_init_handler语法或修改源代码以打开带有websocket++的TCP_NODELAY
EN

Stack Overflow用户
提问于 2014-04-11 22:01:24
回答 2查看 1.1K关注 0票数 0

我在为一个TCP_NODELAY端点实现打开websocket++的示例代码时遇到了困难。

这是一个客户端示例,这是一个服务器示例

testee示例按预期编译和工作,而debug示例经常按预期编译和工作。

我尝试以两种方式设置on_socket_init处理程序,但每次都会得到几乎相同的错误。其中一组错误是:

代码语言:javascript
复制
In constructor ‘broadcast_server::broadcast_server()’:
error: no matching function for call to ‘websocketpp::client<websocketpp::config::asio_tls_client>::set_socket_init_handler(std::_Bind_helper<false, void (*)(std::weak_ptr<void>, boost::asio::basic_stream_socket<boost::asio::ip::tcp>&), const std::_Placeholder<1>&, const std::_Placeholder<2>&>::type)’
         m_endpoint.set_socket_init_handler(bind(&on_socket_init,::_1,::_2));
                                                                           ^
note: candidate is:
In file included from websocketpp/config/asio.hpp:33:0,
                 from websocketpp/transport/asio/security/tls.hpp:373:10: note: void websocketpp::transport::asio::tls_socket::endpoint::set_socket_init_handler(websocketpp::transport::asio::tls_socket::socket_init_handler)
     void set_socket_init_handler(socket_init_handler h) {
          ^
websocketpp/transport/asio/security/tls.hpp:373:10: note:   no known conversion for argument 1 from ‘std::_Bind_helper<false, void (*)(std::weak_ptr<void>, boost::asio::basic_stream_socket<boost::asio::ip::tcp>&), const std::_Placeholder<1>&, const std::_Placeholder<2>&>::type {aka std::_Bind<void (*(std::_Placeholder<1>, std::_Placeholder<2>))(std::weak_ptr<void>, boost::asio::basic_stream_socket<boost::asio::ip::tcp>&)>}’ to ‘websocketpp::transport::asio::tls_socket::socket_init_handler {aka std::function<void(std::weak_ptr<void>, boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >&)>}’
error: no matching function for call to ‘websocketpp::server<websocketpp::config::asio_tls>::set_socket_init_handler(std::_Bind_helper<false, void (*)(std::weak_ptr<void>, boost::asio::basic_stream_socket<boost::asio::ip::tcp>&), const std::_Placeholder<1>&, const std::_Placeholder<2>&>::type)’
         m_server.set_socket_init_handler(bind(&on_socket_init,::_1,::_2));
                                                                         ^
note: candidate is:
In file included from websocketpp/config/asio.hpp:33:0,
                 from websocketpp/transport/asio/security/tls.hpp:373:10: note: void websocketpp::transport::asio::tls_socket::endpoint::set_socket_init_handler(websocketpp::transport::asio::tls_socket::socket_init_handler)
     void set_socket_init_handler(socket_init_handler h) {
          ^
websocketpp/transport/asio/security/tls.hpp:373:10: note:   no known conversion for argument 1 from ‘std::_Bind_helper<false, void (*)(std::weak_ptr<void>, boost::asio::basic_stream_socket<boost::asio::ip::tcp>&), const std::_Placeholder<1>&, const std::_Placeholder<2>&>::type {aka std::_Bind<void (*(std::_Placeholder<1>, std::_Placeholder<2>))(std::weak_ptr<void>, boost::asio::basic_stream_socket<boost::asio::ip::tcp>&)>}’ to ‘websocketpp::transport::asio::tls_socket::socket_init_handler {aka std::function<void(std::weak_ptr<void>, boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp> >&)>}’

我看到了另一篇文章,另一位开发人员声称它正在运行,因为我不完全理解这个语法。

代码语言:javascript
复制
m_endpoint.set_socket_init_handler(bind(&type::on_socket_init,this,::_1));

我不知道如何开始诊断这个问题。

如何解决上述错误?

注意到我正在实现。

所需代码

我最感兴趣的是合并该函数的内容

代码语言:javascript
复制
void on_socket_init(websocketpp::connection_hdl hdl, boost::asio::ip::tcp::socket & s) {
    boost::asio::ip::tcp::no_delay option(true);
    s.set_option(option);
}

是否有一种方法可以修改来源,以便在默认情况下进行此设置?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-12 13:39:46

socket_init_handler是一个低级别钩子,旨在允许在初始化后但在使用之前完全访问基础套接字。socket_init_handler的签名取决于所使用的传输策略。虽然在大多数方面非常相似,但asio/平原和asio/tls实际上是不同的传输策略,确实有一些不同之处。

其中一个不同之处在于,asio/tls策略中使用的基础套接字类型是封装套接字的ssl流,而不仅仅是原始套接字。因此,asio/tls传输的socket_init_handler签名与asio/平原的签名不同。使用asio/tls传输的端点上的处理程序的签名是:

代码语言:javascript
复制
typedef lib::function<void(connection_hdl,boost::asio::ssl::stream<boost::asio::ip::tcp::socket>&)> socket_init_handler;

这可以在socket.html的文档中找到。

设置TCP_NODELAY的相应套接字init处理程序可能如下所示:

代码语言:javascript
复制
void on_socket_init(websocketpp::connection_hdl hdl, boost::asio::ssl::stream<boost::asio::ip::tcp::socket> & s) {
    boost::asio::ip::tcp::no_delay option(true);
    s.lowest_layer().set_option(option);
}

endpoint.set_socket_init_handler(&on_socket_init);
票数 1
EN

Stack Overflow用户

发布于 2014-04-11 22:16:04

socket_init_handler是一个2参数函数:

代码语言:javascript
复制
typedef lib::function<void(connection_hdl,boost::asio::ip::tcp::socket&)> socket_init_handler;

如果on_socket_init是自由函数(不是类type的方法),那么它应该是

代码语言:javascript
复制
m_endpoint.set_socket_init_handler( &on_socket_init );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23023317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档