Subject: [Boost-bugs] [Boost C++ Libraries] #13461: C++ Boost UDP multicast errors out with socket.set_option()
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2018-03-03 04:30:29
#13461: C++ Boost UDP multicast errors out with socket.set_option()
--------------------------------------+-------------------------
Reporter: nguyen.tnhoang@⦠| Owner: (none)
Type: Bugs | Status: new
Milestone: To Be Determined | Component: None
Version: Boost 1.66.0 | Severity: Showstopper
Keywords: udp multicast set_option |
--------------------------------------+-------------------------
I am following an example of Boost UDP multicast sending and receiving
here(https://stackoverflow.com/questions/12708558/c-multiple-multicast-
receiver-with-boost-asio/12749727#12749727). I make some modifications to
predefine IP and port:
#include <ctime>
#include <iostream>
#include <string>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/asio.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/thread.hpp>
using boost::asio::ip::udp;
using std::cout;
using std::cin;
using std::endl;
void read(boost::asio::ip::udp::socket& socket)
{
boost::asio::ip::udp::endpoint sender;
std::vector<char> buffer;
std::size_t bytes_readable = 0;
for (int i = 0; i < 3; ++i)
{
// Poll until data is available.
while (!bytes_readable)
{
// Issue command to socket to get number of bytes
readable.
boost::asio::socket_base::bytes_readable
num_of_bytes_readable(true);
socket.io_control(num_of_bytes_readable);
// Get the value from the command.
bytes_readable = num_of_bytes_readable.get();
// If there is no data available, then sleep.
if (!bytes_readable)
{
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
}
// Resize the buffer to store all available data.
buffer.resize(bytes_readable);
// Read available data.
socket.receive_from(
boost::asio::buffer(buffer, bytes_readable),
sender);
// Extract data from the buffer.
std::string message(buffer.begin(), buffer.end());
// Output data.
std::cout << "Received message: ";
std::cout << message << std::endl;
}
}
void write(boost::asio::ip::udp::socket& socket,
boost::asio::ip::udp::endpoint& destination)
{
std::string message;
for (unsigned int i = 0; i < 3; ++i)
{
std::ostringstream stream;
stream << i;
message = stream.str();
socket.send_to(boost::asio::buffer(message), destination);
std::cout << "Sent message: " << message << std::endl;
}
}
int main()
{
//
============================================================================================================
bool receiver = false;
boost::asio::ip::address address =
boost::asio::ip::address::from_string("127.0.0.1");
unsigned short port = boost::lexical_cast<unsigned short>("13");
// Create socket.
using boost::asio::ip::udp;
boost::asio::io_service service;
udp::socket socket(service);
socket.open(boost::asio::ip::udp::v4());
// Allow other processes to reuse the address, permitting other
processes on
// the same machine to use the multicast address.
socket.set_option(udp::socket::reuse_address(true));
// Guarantee the loopback is enabled so that multiple processes on
the same
// machine can receive data that originates from the same socket.
socket.set_option(boost::asio::ip::multicast::enable_loopback(true));
socket.bind(udp::endpoint(boost::asio::ip::address_v4::any(),
port));
udp::endpoint destination(address, port);
// Join group.
namespace ip = boost::asio::ip;
socket.set_option(ip::multicast::join_group(address));
// Start read or write loops based on command line options.
if (receiver) read(socket);
else write(socket, destination);
return 0;
}
An error is thrown here:
socket.set_option(ip::multicast::join_group(address));
with this detail:
Microsoft C++ exception: boost::exception_detail::clone_impl > at memory
location 0x0040F470. occurred
Can someone please tell me what went wrong? Thanks.
-- Ticket URL: <https://svn.boost.org/trac10/ticket/13461> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2018-03-03 04:34:48 UTC