如何设置acceptor以支持Unix域套接字与TCP套接字?
通用流协议服务器实现示例(基于Boost.Asio)
下面是一个可兼容TCP、Unix域套接字等流协议的通用服务器实现,核心使用boost::asio::generic::stream_protocol系列组件统一处理不同流协议的监听与连接逻辑:
通用服务器类实现
#include <boost/asio.hpp> #include <iostream> #include <memory> #include <array> #include <string> namespace asio = boost::asio; using generic_stream = asio::generic::stream_protocol; class GenericStreamServer { public: GenericStreamServer(asio::io_context& io_context, const generic_stream::endpoint& endpoint) : io_context_(io_context), acceptor_(io_context, endpoint.protocol()) { acceptor_.bind(endpoint); acceptor_.listen(asio::socket_base::max_listen_connections); start_accept(); } private: void start_accept() { auto socket = std::make_shared<generic_stream::socket>(io_context_); acceptor_.async_accept(*socket, [this, socket](const boost::system::error_code& ec) { if (!ec) { handle_connection(socket); } else { std::cerr << "Accept failed: " << ec.message() << std::endl; } start_accept(); }); } void handle_connection(const std::shared_ptr<generic_stream::socket>& socket) { auto buffer = std::make_shared<std::array<char, 1024>>(); socket->async_read_some(asio::buffer(*buffer), [this, socket, buffer](const boost::system::error_code& ec, std::size_t bytes_read) { if (!ec && bytes_read > 0) { asio::async_write(*socket, asio::buffer(*buffer, bytes_read), [this, socket, buffer](const boost::system::error_code& ec, std::size_t) { if (!ec) { handle_connection(socket); } else { std::cerr << "Write failed: " << ec.message() << std::endl; } }); } else { if (ec != asio::error::eof) { std::cerr << "Read failed: " << ec.message() << std::endl; } } }); } asio::io_context& io_context_; generic_stream::acceptor acceptor_; };
不同协议的使用示例
TCP协议场景
int main() { try { asio::io_context io_context; // 构建TCP通用端点(IPv4,监听12345端口) generic_stream::endpoint tcp_endpoint( asio::ip::tcp::v4(), 12345 ); GenericStreamServer tcp_server(io_context, tcp_endpoint); std::cout << "TCP server running on port 12345" << std::endl; io_context.run(); } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; }
Unix域套接字场景
int main() { try { asio::io_context io_context; const char* socket_path = "/tmp/unix_stream_socket"; // 清理旧套接字文件(避免绑定失败) std::remove(socket_path); // 构建Unix域通用端点 generic_stream::endpoint unix_endpoint( asio::local::stream_protocol(), socket_path ); GenericStreamServer unix_server(io_context, unix_endpoint); std::cout << "Unix domain server running on " << socket_path << std::endl; io_context.run(); } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; }
关键说明
- 通用Acceptor:
generic_stream::acceptor通过端点的协议类型初始化,无需为TCP/Unix域单独编写监听逻辑 - 端点兼容性:原生流协议端点(如
asio::ip::tcp::endpoint、asio::local::stream_protocol::endpoint)可隐式转换为generic_stream::endpoint - 统一连接处理:接受的
generic_stream::socket完全兼容Boost.Asio的异步读写接口,逻辑与普通套接字一致 - Unix域注意事项:启动前需清理已存在的套接字文件,否则会触发绑定失败错误
内容的提问来源于stack exchange,提问作者hl037_
相关产品推荐
相关产品推荐

