2016-05-06 67 views
5

は、私が作成し、ソケットのエンドポイントのパス名を指定することにより、タイプSOCK_SEQPACKETunix domain socketに接続したいが、これはboost::asio V1.60でコンパイルに失敗します。 boost :: asioでunixドメインソケットに接続するには?

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 

はあなたが適切に作成する方法を知っていますかUnixドメインソケット?

答えて

3

は、私はそれをシンプルに保つためにお勧め:

#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"); 
} 

間違いなくあなたは、より低レベルに行くことができますが、それを必要とするだろうとき、私はよく分かりません。 stream_protocol事前定義されたを模倣

UPDATEは、ここ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) 
    }; 
} 

ただ、同じパターンでそれを使用します。

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

    seqpacket_protocol::socket s(io_service); 
    s.connect("socket"); 
} 
+0

私はSEQPACKETが何を理解することができるかどうかを少し調べるでしょう。もし私がそれを取得した場合、私は更新するかもしれません:) – sehe

+0

規定通り 'IPPROTO_SCTP'を使用するサンプルで更新されました。 – sehe

+0

多くのありがとう、しかし私はなぜ著者が::ローカルプロトコルセットにseqpacketを追加しなかったのだろうか – Martin

関連する問題