如何使用boost :: asio连接到unix域套接字?

Mar*_*tin 5 c++ sockets boost boost-asio

我想 通过指定套接字端点的路径名来创建和连接到unix domain socket类型SOCK_SEQPACKET,但是这无法在boost::asiov1.60中编译:

using namespace boost::asio::generic;
seq_packet_protocol proto{AF_UNIX, IPPROTO_SCTP}; // SOCK_SEQPACKET
seq_packet_protocol::socket sock(io_service, proto);
boost::asio::local::basic_endpoint<seq_packet_protocol> ep("/tmp/socket");
sock.connect(ep); // does not compile
Run Code Online (Sandbox Code Playgroud)

你知道如何正确创建一个unix域套接字吗?

seh*_*ehe 6

我建议保持简单:

#include <boost/asio.hpp>

int main() {
    boost::asio::io_service io_service;
    using boost::asio::local::stream_protocol;

    stream_protocol::socket s(io_service);
    s.connect("/tmp/socket");
}
Run Code Online (Sandbox Code Playgroud)

毫无疑问,您可以进入更底层,但我不确定您何时需要它。

更新模仿预定义stream_protocol,这里是如何定义seqpacket_protocol

Live On Coliru

namespace SeqPacket {
    using namespace boost::asio::local;

    struct seqpacket_protocol
    {
        int type()     const { return IPPROTO_SCTP; }
        int protocol() const { return 0;            }
        int family()   const { return AF_UNIX;      }

        typedef basic_endpoint<seqpacket_protocol> endpoint;
        typedef boost::asio::basic_stream_socket<seqpacket_protocol> socket;
        typedef boost::asio::basic_socket_acceptor<seqpacket_protocol> acceptor;

#if !defined(BOOST_ASIO_NO_IOSTREAM)
        /// The UNIX domain iostream type.
        typedef boost::asio::basic_socket_iostream<seqpacket_protocol> iostream;
#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
    };
}
Run Code Online (Sandbox Code Playgroud)

只需以相同的模式使用它:

int main() {
    boost::asio::io_service io_service;
    using SeqPacket::seqpacket_protocol;

    seqpacket_protocol::socket s(io_service);
    s.connect("socket");
}
Run Code Online (Sandbox Code Playgroud)