специфичная для источника многоадресная рассылка с использованием boost - PullRequest
4 голосов
/ 26 декабря 2011

Как я могу присоединиться к групповой многоадресной (ssm) группе с использованием boost?

Я успешно присоединился к группе многоадресной рассылки с любым источником, используя

set_option( ip::multicast::join_group( mcAddr.to_v4(), ifAddr.to_v4( )));

но я понятия не имею, как установить ssm (IP_ADD_SOURCE_MEMBERSHIP).

Как я могу это сделать? Спасибо.

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Похоже, вам придется реализовать их концепцию SettableSocketOption. Проверка того, как выполняются существующие параметры многоадресной рассылки ( svn link ), может помочь.

0 голосов
/ 24 мая 2018

да. Я использую это

//---------------------------------------------------------------------------------------------------------
// class add_source_membership_v4
// is for Windows Sockets 2 IPv4
// to set IP_ADD_SOURCE_MEMBERSHIP option.
//---------------------------------------------------------------------------------------------------------
class add_source_membership_v4
{
private:
    ip_mreq_source ipv4_value_{};

public:
    // Default constructor.
    // Construct with multicast address and IPv4 address specifying an interface.
    add_source_membership_v4(
        const boost::asio::ip::address_v4& multicast_address,
        const boost::asio::ip::address_v4& source_address,
        const boost::asio::ip::address_v4& network_interface = boost::asio::ip::address_v4::any())
    {
        ipv4_value_.imr_multiaddr.s_addr =
            boost::asio::detail::socket_ops::host_to_network_long(
                multicast_address.to_uint());
        ipv4_value_.imr_sourceaddr.s_addr =
            boost::asio::detail::socket_ops::host_to_network_long(
                source_address.to_uint());
        ipv4_value_.imr_interface.s_addr =
            boost::asio::detail::socket_ops::host_to_network_long(
                network_interface.to_uint());
    }

    // Returns a value suitable for passing as the level argument to POSIX setsockopt() (or equivalent).
    template <typename Protocol>
    int level(const Protocol&) const noexcept
    {
        return BOOST_ASIO_OS_DEF(IPPROTO_IP);
    }

    // Returns a value suitable for passing as the option_name argument to POSIX setsockopt() (or equivalent).
    template <typename Protocol>
    int name(const Protocol&) const noexcept
    {
        return IP_ADD_SOURCE_MEMBERSHIP;
    }

    // Returns a pointer suitable for passing as the option_value argument to POSIX setsockopt() (or equivalent).
    template <typename Protocol>
    const void* data(const Protocol&) const noexcept
    {
        return &ipv4_value_;
    }

    // Returns a value suitable for passing as the option_len argument to POSIX setsockopt() (or equivalent),
    // after appropriate integer conversion has been performed.
    template <typename Protocol>
    std::size_t size(const Protocol&) const noexcept
    {
        return sizeof(ipv4_value_);
    }
};
...