2016-05-06 40 views
5

Voglio creare e connettersi a un unix domain socket di tipo SOCK_SEQPACKET specificando il nome del percorso del punto finale presa, ma questo non riesce a compilare in boost::asio v1.60:Come connettersi a un socket di dominio unix con boost :: asio?

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 

Sapete come creare correttamente un unix domain socket?

risposta

3

consiglio di mantenere le cose semplici:

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

Non c'è dubbio che si può andare più a basso livello, ma non sono sicuro che quando avresti bisogno di questo.

UPDATE Imitando il pre-definito stream_protocol, ecco come definire 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) 
    }; 
} 

Basta usare lo stesso schema:

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

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

Leggerò un po 'per vedere se riesco a capire cosa fa SEQPACKET. Posso aggiornare se ottengo :) – sehe

+0

Aggiornato con un esempio che utilizza 'IPPROTO_SCTP' come prescritto. – sehe

+0

molte grazie, ma mi chiedo perché gli autori non hanno aggiunto seqpacket al set di protocolli :: local – Martin