正确的set_socket_int_handler语法或修改源以使用websocket++打开TCP_NODELAY
Proper set_socket_init_handler syntax or modify source to turn on TCP_NODELAY with websocket++
我在实现为websocket++端点打开TCP_NODELAY的示例代码时遇到问题。
这是一个客户端示例,也是一个服务器示例。
testee
示例按预期编译和工作,而debug
示例经常按预期编译并工作。
我尝试过用两种方式设置on_socket_init
处理程序,但每次都会遇到几乎相同的错误。其中一组错误是:
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> >&)>}’
我看到另一篇帖子,另一位开发人员声称已经运行了它,由于我不完全理解的语法
m_endpoint.set_socket_init_handler(bind(&type::on_socket_init,this,::_1));
我不确定如何开始诊断这个问题。
如何解决上述错误?
注意我正在实施TLS。
所需代码
我最感兴趣的是合并这个功能的内容:
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);
}
是否有一种方法可以修改源,以便在默认情况下进行此设置?
socket_init_handler
是一个2-参数函数:
typedef lib::function<void(connection_hdl,boost::asio::ip::tcp::socket&)> socket_init_handler;
如果on_socket_init
是自由函数(而不是type
类的方法),那么它应该像一样
m_endpoint.set_socket_init_handler( &on_socket_init );
socket_init_handler是一个低级别的挂钩,旨在允许在初始化底层套接字之后但在使用之前对其进行完全访问。socket_init_handler的签名取决于使用的传输策略。虽然在大多数方面非常相似,但asio/plain和asio/tls实际上是不同的运输政策,确实存在一些差异。
其中一个区别是,asio/tls策略中使用的底层套接字类型是包装套接字的ssl流,而不仅仅是原始套接字。因此,asio/tls传输的socket_init_handler的签名与asio/plain的签名不同。使用asio/tls传输的端点上的处理程序的签名是:
typedef lib::function<void(connection_hdl,boost::asio::ssl::stream<boost::asio::ip::tcp::socket>&)> socket_init_handler;
这可以在以下文档中找到:http://doxygen.websocketpp.org/namespacewebsocketpp_1_1transport_1_1asio_1_1tls__socket.html
为设置TCP_NODELAY的相应套接字初始化处理程序可能看起来像:
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);
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- Websocket++ 错误:收到错误handle_transport_init TLS 握手失败
- 通过TCP的PvP通信问题
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 通过单独的 tcp 流建立 http 连接
- 读取 TCP 标头并使用RAW_SOCKET管理 TCP 连接
- 如何使用 boost beast websocket 客户端收听 websocket feed?
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- grpc 的 ServerBuilder::AddListeningPort() 总是返回 TCP 端口零
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何在没有侦听器的情况下创建 TCP 连接?
- Boost (Beast) websocket:同步写入挂起
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const