I think there's an error in boost example code for udp multicast.
In the example code they bind socket to local interface but for udp multicast you have to bind to the udp multicast group IP and port.
socket_.bind(listen_endpoint);
should be:
socket_.bind(
    boost::asio::ip::udp::endpoint( multicast_address, multicast_port ) );
see multicast howto:
... for a process to receive multicast datagrams it has to ask the kernel
  to join the group and bind the port those datagrams were being sent
  to. The UDP layer uses both the destination address and port to
  demultiplex the packets and decide which socket(s) deliver them to ...
... it is necessary to advise the kernel which multicast groups we are
  interested in. That is, we have to ask the kernel to "join" those
  multicast groups ...
check if you joined the group on correct interface with netstat -g | grep <multicast_group_ip>
this is I believe incorrect boost example code:
boost::asio::ip::udp::endpoint listen_endpoint(
    listen_address, multicast_port);
socket_.open(listen_endpoint.protocol());
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
socket_.bind(listen_endpoint);
// Join the multicast group.
socket_.set_option(
    boost::asio::ip::multicast::join_group(multicast_address));
socket_.async_receive_from(
    boost::asio::buffer(data_, max_length), sender_endpoint_,
    boost::bind(&receiver::handle_receive_from, this,
      boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));