AF_NETLINK (netlink) сокеты с использованием boost :: asio

m написание многоадресного клиент / серверного приложения на основеэтот а такжеэтот; которые отлично работают

Тем не менее, мне также нужно будет что-то сделать, когда количество активных сетевых интерфейсов в компьютере изменится, что-то вроде того, что программа в разделе примераэта страница делает.

Я думаю, что я должен использовать инструменты в boost :: asio :: local, но я не уверен, должен ли я использоватьboost::asio::local::datagram_protocol или жеboost::asio::local::stream_protocol или же...

Пример того, как сделать что-то похожее, было бы очень полезным. Благодарю.

 Brian Cain06 дек. 2012 г., 06:15
Это'было бы замечательно, если бы мы могли предоставить такие специфические для ОС функции, как эти, в какой-тоboost дополнительный пакет

Ответы на вопрос(1)

Решение Вопроса

Как вы заметили тамнемного больше кода, который должен быть написан, чтобы сделать это.

Netlink использует свое собственное семейство адресов (PF_NETLINK) и неTCP или UDP. Вместо этого он использует RAW сокеты. Поскольку это частная семья (не PF_INET или PF_INET6), мы должны определить ее сами.

Я использовал базовый локальный сокет Unix в качестве шаблона для реализации этого (см. Внизу для тестовой программы). Если вы неЯ не хочу копировать, вставлять весь код, я также положил его на github (http://github.com/gille/boost_netlink):

template 
class nl_endpoint
{
private:
    sockaddr_nl sockaddr;
public:
    /// The protocol type associated with the endpoint.
    typedef Protocol protocol_type;
    typedef boost::asio::detail::socket_addr_type data_type;        

    /// Default constructor.
    nl_endpoint()
    {
        sockaddr.nl_family = PF_NETLINK;
        sockaddr.nl_groups = 0;
        sockaddr.nl_pid = getpid(); 
    }

    /// Construct an endpoint using the specified path name.
    nl_endpoint(int group, int pid=getpid())
    {
        sockaddr.nl_family = PF_NETLINK;
        sockaddr.nl_groups = group;
        sockaddr.nl_pid = pid;
    }

    /// Copy constructor.
    nl_endpoint(const nl_endpoint& other)
    {
        sockaddr = other.sockaddr;
    }

    /// Assign from another endpoint.
    nl_endpoint& operator=(const nl_endpoint& other)
    {
        sockaddr = other.sockaddr;
        return *this;
    }

    /// The protocol associated with the endpoint.
    protocol_type protocol() const
    {
        return protocol_type();
    }

    /// Get the underlying endpoint in the native type.
    data_type* data()
    {
        return &sockaddr;
    }

    /// Get the underlying endpoint in the native type.
    const data_type* data() const
    {
        return (struct sockaddr*)&sockaddr;
    }

    /// Get the underlying size of the endpoint in the native type.
    std::size_t size() const
    {
        return sizeof(sockaddr);
    }

    /// Set the underlying size of the endpoint in the native type.
    void resize(std::size_t size)
    {
    /* nothing we can do here */
    }

    /// Get the capacity of the endpoint in the native type.
    std::size_t capacity() const
    {
        return sizeof(sockaddr);
    }

    /// Compare two endpoints for equality.
    friend bool operator==(const nl_endpoint& e1,
               const nl_endpoint& e2)
    {
        return e1.sockaddr == e2.sockaddr;
    }

    /// Compare two endpoints for inequality.
    friend bool operator!=(const nl_endpoint& e1,
               const nl_endpoint& e2)
    {
        return !(e1.sockaddr == e2.sockaddr);
    }

    /// Compare endpoints for ordering.
    friend bool operator
 gangadhars26 мая 2014 г., 10:14
нужна ваша помощь;stackoverflow.com/questions/23852866/...

Ваш ответ на вопрос