You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:44:50