SOCK_SEQPACKET Boost::asio 中的支持

SOCK_SEQPACKET support in Boost::asio

本文关键字:支持 asio SOCK SEQPACKET Boost      更新时间:2023-10-16

是否支持在boost asio中创建带有SOCK_SEQPACKET参数的Unix域套接字?我在官方参考中没有找到任何内容,但也许有解决方法?

你应该

看看boost::asio::seq_packet_socket_service

template<typename Protocol>
class seq_packet_socket_service : public io_service::service

在 http://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/seq_packet_socket_service.html 查看更多信息

答案为我指明了正确的方向。这是一个对我有用的更完整的示例。它是使用独立 asio 和 C++17 std::filesystem删除旧文件的服务器部分。

#include <asio.hpp>
#include <array>
#include <filesystem>
#include <string>
int main() {
    asio::io_context io_context;
    std::error_code ec;
    std::array<char, 8192> buffer{};
    const std::string socket_address{"://tmp/sock.uds"};
    std::filesystem::remove(socket_address.substr(2, socket_address.size() - 2), ec);
    std::cout << "Removing " << socket_address << "; " << ec.message() << "n";
    asio::generic::seq_packet_protocol::endpoint ep{socket_address.c_str(), socket_address.size()};
    ep.data()->sa_family = AF_LOCAL;
    asio::basic_socket_acceptor<asio::generic::seq_packet_protocol, asio::io_context::executor_type> acceptor(io_context);
    acceptor.open(ep.protocol(), ec);
    acceptor.bind(ep, ec);
    acceptor.listen(1);
    auto socket = acceptor.accept(ec);
    asio::socket_base::message_flags out_flags;
    std::cout << "Connection accepted";
    for (;;) {
        socket.receive(asio::buffer(buffer, buffer.size()), out_flags);
        std::cout << ec.message() << "n";
        std::cout << buffer.data() << "n";
    }
    return 0;
}

好吧,我发现了一个东西,它是在 boost 1.54.0 中添加的。它被称为通用::seq_packet_protocol。当初始化为 seq_packet_protocol(AF_UNIX, 0)) 时,它会生成一个对象,该对象可用于打开套接字、创建接受器和端点。因此,SCTP可以以相同的方式实现。