mirror of
https://github.com/boostorg/asio.git
synced 2026-01-28 18:52:09 +00:00
........ r44662 | chris_kohlhoff | 2008-04-21 11:23:42 +1000 (Mon, 21 Apr 2008) | 3 lines Add ability to disable the uses of the typeid operator by defining BOOST_NO_TYPEID or BOOST_ASIO_NO_TYPEID. ........ r44663 | chris_kohlhoff | 2008-04-21 11:27:48 +1000 (Mon, 21 Apr 2008) | 3 lines Ensure that timer dispatching responsibility is correctly relinquished when processing leftover interrupts from a previous run invocation. ........ r44665 | chris_kohlhoff | 2008-04-21 11:36:28 +1000 (Mon, 21 Apr 2008) | 3 lines Enhance example to make it clear that invocation hooking can be used with asynchronous operations. ........ r44666 | chris_kohlhoff | 2008-04-21 11:39:06 +1000 (Mon, 21 Apr 2008) | 3 lines Improve efficiency of basic_streambuf::consume() by using a single call to gbump() rather than calling sbumpc() in a loop. ........ r44667 | chris_kohlhoff | 2008-04-21 11:41:29 +1000 (Mon, 21 Apr 2008) | 2 lines Update version number to match release. ........ r44668 | chris_kohlhoff | 2008-04-21 11:42:10 +1000 (Mon, 21 Apr 2008) | 2 lines Fix infinite recursion in the ssl::stream's shutdown() implementation. ........ r44670 | chris_kohlhoff | 2008-04-21 12:01:34 +1000 (Mon, 21 Apr 2008) | 2 lines Improve documentation for the protected functions and data in basic_io_object<>. ........ r44673 | chris_kohlhoff | 2008-04-21 14:02:37 +1000 (Mon, 21 Apr 2008) | 4 lines Add a special null_buffers type that allows read and write operations to be used to indicate the socket's readiness to read or write without blocking. ........ r44674 | chris_kohlhoff | 2008-04-21 14:43:05 +1000 (Mon, 21 Apr 2008) | 2 lines Add support for UNIX domain sockets. ........ r44675 | chris_kohlhoff | 2008-04-21 15:16:15 +1000 (Mon, 21 Apr 2008) | 2 lines Add new wrapper classes for stream-oriented file descriptors on POSIX platforms. ........ r44676 | chris_kohlhoff | 2008-04-21 15:32:34 +1000 (Mon, 21 Apr 2008) | 2 lines Add new wrapper classes for stream-oriented handles on Windows. ........ r44678 | chris_kohlhoff | 2008-04-21 15:43:42 +1000 (Mon, 21 Apr 2008) | 3 lines Add porthopper example to demonstrate applications that mix synchronous and asynchronous operations. ........ r44679 | chris_kohlhoff | 2008-04-21 15:52:20 +1000 (Mon, 21 Apr 2008) | 3 lines Remove a local variable that was hiding the ec parameter and preventing error codes from being correctly propagated. Fixes #1820. ........ r44681 | chris_kohlhoff | 2008-04-21 16:14:29 +1000 (Mon, 21 Apr 2008) | 2 lines Ensure all non-friend related functions are included in the documentation. ........ r44682 | chris_kohlhoff | 2008-04-21 16:15:17 +1000 (Mon, 21 Apr 2008) | 3 lines Add UNIX domain sockets, POSIX stream-oriented descriptors and Windows stream-oriented handles to the reference documentation. ........ r44683 | chris_kohlhoff | 2008-04-21 16:15:50 +1000 (Mon, 21 Apr 2008) | 2 lines Regenerate documentation. ........ r44684 | chris_kohlhoff | 2008-04-21 16:20:32 +1000 (Mon, 21 Apr 2008) | 3 lines Add documentation on the limits of the number of buffers that may be transferred in individual operations. ........ r44685 | chris_kohlhoff | 2008-04-21 17:59:21 +1000 (Mon, 21 Apr 2008) | 3 lines Add requirements for handle and descriptor services. Add new classes to the quickref index page. ........ r44727 | chris_kohlhoff | 2008-04-23 09:46:15 +1000 (Wed, 23 Apr 2008) | 2 lines Fix or suppress MSVC level 4 warnings. Fixes #1703. ........ r44848 | chris_kohlhoff | 2008-04-28 23:35:27 +1000 (Mon, 28 Apr 2008) | 2 lines Update asio version number. ........ r44849 | chris_kohlhoff | 2008-04-28 23:36:18 +1000 (Mon, 28 Apr 2008) | 2 lines Add raw socket support. ........ r44851 | chris_kohlhoff | 2008-04-28 23:56:07 +1000 (Mon, 28 Apr 2008) | 2 lines Add an experimental two-lock queue implementation for task_io_service. ........ r44997 | chris_kohlhoff | 2008-05-02 08:00:26 +1000 (Fri, 02 May 2008) | 3 lines Add a fast path for some speculative read and write operations in the epoll_reactor. ........ r44998 | chris_kohlhoff | 2008-05-02 08:27:21 +1000 (Fri, 02 May 2008) | 3 lines A memory barrier is needed on some platforms to ensure that all updates to the node occur before the tail pointer is updated. ........ r45006 | chris_kohlhoff | 2008-05-02 17:59:01 +1000 (Fri, 02 May 2008) | 3 lines Fully qualify uses of asio's placeholders to resolve ambiguity with C++0x's placeholders namespace. ........ r45010 | chris_kohlhoff | 2008-05-02 18:38:15 +1000 (Fri, 02 May 2008) | 3 lines Don't use the names readv and writev for functions defined inside asio as these names seem to be macros on Tru64. ........ r45059 | chris_kohlhoff | 2008-05-03 21:36:16 +1000 (Sat, 03 May 2008) | 2 lines Add fast-pathing of speculative reads and writes to the kqueue_reactor. ........ r45122 | chris_kohlhoff | 2008-05-05 16:30:13 +1000 (Mon, 05 May 2008) | 2 lines Implement custom memory allocation support for reactor-based asynchronous operations. ........ r45179 | chris_kohlhoff | 2008-05-07 08:09:47 +1000 (Wed, 07 May 2008) | 2 lines Use an atomic counter for strand reference counting. ........ r45292 | chris_kohlhoff | 2008-05-12 18:30:21 +1000 (Mon, 12 May 2008) | 2 lines Regenerate documentation to include raw socket classes. ........ r45293 | chris_kohlhoff | 2008-05-12 18:35:56 +1000 (Mon, 12 May 2008) | 2 lines Don't generate enum value lists for empty enums. ........ r45355 | chris_kohlhoff | 2008-05-14 22:17:26 +1000 (Wed, 14 May 2008) | 3 lines Add check for empty heap when determining the minimum wait duration for a timer queue. ........ r45600 | chris_kohlhoff | 2008-05-21 19:25:12 +1000 (Wed, 21 May 2008) | 2 lines Implement custom allocation support for timer operations. ........ r45633 | chris_kohlhoff | 2008-05-22 08:56:49 +1000 (Thu, 22 May 2008) | 2 lines Some Windows platforms don't define IPPROTO_ICMPV6. ........ r45811 | chris_kohlhoff | 2008-05-27 17:54:12 +1000 (Tue, 27 May 2008) | 3 lines Fix a crash that can occur when destroying a handler object that owns its own memory (as is the case when destroying handlers in an orphaned strand). ........ r45935 | chris_kohlhoff | 2008-05-30 18:39:19 +1000 (Fri, 30 May 2008) | 5 lines Fix a deadlock that can occur when destroying a thread object with global lifetime in a dynamically loaded DLL on Windows. Note that deadlock can still occur if the thread is launched by the constructor of an object with global lifetime. ........ r46003 | chris_kohlhoff | 2008-06-01 11:31:25 +1000 (Sun, 01 Jun 2008) | 4 lines Add test for the crash that can occur when destroying a handler object that owns its own memory (as is the case when destroying handlers in an orphaned strand). ........ r46272 | chris_kohlhoff | 2008-06-09 22:54:55 +1000 (Mon, 09 Jun 2008) | 2 lines Add support for serial ports. ........ r46319 | chris_kohlhoff | 2008-06-11 21:17:53 +1000 (Wed, 11 Jun 2008) | 2 lines Add random-access handles for use on Windows. ........ r46325 | chris_kohlhoff | 2008-06-11 22:41:48 +1000 (Wed, 11 Jun 2008) | 2 lines Remove repeated typedef of reactor_type. ........ r46327 | chris_kohlhoff | 2008-06-11 23:07:41 +1000 (Wed, 11 Jun 2008) | 2 lines Only perform check for a 0-byte receive meaning EOF on SOCK_STREAM sockets. ........ r46415 | chris_kohlhoff | 2008-06-16 10:41:29 +1000 (Mon, 16 Jun 2008) | 2 lines Add an iterator for bytewise traversal of a buffer sequence. ........ r46473 | chris_kohlhoff | 2008-06-18 21:22:21 +1000 (Wed, 18 Jun 2008) | 2 lines Fix write_at declaration. Add missing documentation for offset parameters. ........ r46475 | chris_kohlhoff | 2008-06-18 23:03:46 +1000 (Wed, 18 Jun 2008) | 3 lines Add new overloads for read_until and async_read_until that invoke a user-defined function object to determine when a match has been found. ........ r46476 | chris_kohlhoff | 2008-06-18 23:08:21 +1000 (Wed, 18 Jun 2008) | 2 lines Regenerate documentation. ........ r46506 | chris_kohlhoff | 2008-06-19 22:41:32 +1000 (Thu, 19 Jun 2008) | 2 lines Fix for unicode builds. ........ r46507 | chris_kohlhoff | 2008-06-19 22:50:02 +1000 (Thu, 19 Jun 2008) | 3 lines Fix serial port support on POSIX platforms that don't provide the BSD extensions cfmakeraw, cfsetspeed and CRTSCTS. ........ [SVN r46533]
350 lines
11 KiB
C++
350 lines
11 KiB
C++
//
|
|
// multicast.cpp
|
|
// ~~~~~~~~~~~~~
|
|
//
|
|
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
|
|
// Disable autolinking for unit tests.
|
|
#if !defined(BOOST_ALL_NO_LIB)
|
|
#define BOOST_ALL_NO_LIB 1
|
|
#endif // !defined(BOOST_ALL_NO_LIB)
|
|
|
|
// Test that header file is self-contained.
|
|
#include <boost/asio/ip/multicast.hpp>
|
|
|
|
#include <boost/asio.hpp>
|
|
#include "../unit_test.hpp"
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// ip_multicast_compile test
|
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// The following test checks that all nested classes, enums and constants in
|
|
// ip::multicast compile and link correctly. Runtime failures are ignored.
|
|
|
|
namespace ip_multicast_compile {
|
|
|
|
void test()
|
|
{
|
|
using namespace boost::asio;
|
|
namespace ip = boost::asio::ip;
|
|
|
|
try
|
|
{
|
|
io_service ios;
|
|
ip::udp::socket sock(ios);
|
|
const ip::address address;
|
|
const ip::address_v4 address_v4;
|
|
const ip::address_v6 address_v6;
|
|
|
|
// join_group class.
|
|
|
|
ip::multicast::join_group join_group1;
|
|
ip::multicast::join_group join_group2(address);
|
|
ip::multicast::join_group join_group3(address_v4);
|
|
ip::multicast::join_group join_group4(address_v4, address_v4);
|
|
ip::multicast::join_group join_group5(address_v6);
|
|
ip::multicast::join_group join_group6(address_v6, 1);
|
|
sock.set_option(join_group6);
|
|
|
|
// leave_group class.
|
|
|
|
ip::multicast::leave_group leave_group1;
|
|
ip::multicast::leave_group leave_group2(address);
|
|
ip::multicast::leave_group leave_group3(address_v4);
|
|
ip::multicast::leave_group leave_group4(address_v4, address_v4);
|
|
ip::multicast::leave_group leave_group5(address_v6);
|
|
ip::multicast::leave_group leave_group6(address_v6, 1);
|
|
sock.set_option(leave_group6);
|
|
|
|
// outbound_interface class.
|
|
|
|
ip::multicast::outbound_interface outbound_interface1;
|
|
ip::multicast::outbound_interface outbound_interface2(address_v4);
|
|
ip::multicast::outbound_interface outbound_interface3(1);
|
|
sock.set_option(outbound_interface3);
|
|
|
|
// hops class.
|
|
|
|
ip::multicast::hops hops1(1024);
|
|
sock.set_option(hops1);
|
|
ip::multicast::hops hops2;
|
|
sock.get_option(hops2);
|
|
hops1 = 1;
|
|
static_cast<int>(hops1.value());
|
|
|
|
// enable_loopback class.
|
|
|
|
ip::multicast::enable_loopback enable_loopback1(true);
|
|
sock.set_option(enable_loopback1);
|
|
ip::multicast::enable_loopback enable_loopback2;
|
|
sock.get_option(enable_loopback2);
|
|
enable_loopback1 = true;
|
|
static_cast<bool>(enable_loopback1);
|
|
static_cast<bool>(!enable_loopback1);
|
|
static_cast<bool>(enable_loopback1.value());
|
|
}
|
|
catch (std::exception&)
|
|
{
|
|
}
|
|
}
|
|
|
|
} // namespace ip_multicast_compile
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
// ip_multicast_runtime test
|
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// The following test checks the runtime operation of the socket options defined
|
|
// in the ip::multicast namespace.
|
|
|
|
namespace ip_multicast_runtime {
|
|
|
|
#if defined(__hpux)
|
|
// HP-UX doesn't declare this function extern "C", so it is declared again here
|
|
// to avoid a linker error about an undefined symbol.
|
|
extern "C" unsigned int if_nametoindex(const char*);
|
|
#endif // defined(__hpux)
|
|
|
|
void test()
|
|
{
|
|
using namespace boost::asio;
|
|
namespace ip = boost::asio::ip;
|
|
|
|
io_service ios;
|
|
boost::system::error_code ec;
|
|
|
|
ip::udp::endpoint ep_v4(ip::address_v4::loopback(), 0);
|
|
ip::udp::socket sock_v4(ios);
|
|
sock_v4.open(ep_v4.protocol(), ec);
|
|
sock_v4.bind(ep_v4, ec);
|
|
bool have_v4 = !ec;
|
|
|
|
ip::udp::endpoint ep_v6(ip::address_v6::loopback(), 0);
|
|
ip::udp::socket sock_v6(ios);
|
|
sock_v6.open(ep_v6.protocol(), ec);
|
|
sock_v6.bind(ep_v6, ec);
|
|
bool have_v6 = !ec;
|
|
|
|
BOOST_CHECK(have_v4 || have_v6);
|
|
|
|
#if defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
// Windows CE seems to have problems with some multicast group addresses.
|
|
// The following address works on CE, but as it is not a private multicast
|
|
// address it will not be used on other platforms.
|
|
const ip::address multicast_address_v4 =
|
|
ip::address::from_string("239.0.0.4", ec);
|
|
#else // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
const ip::address multicast_address_v4 =
|
|
ip::address::from_string("239.255.0.1", ec);
|
|
#endif // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
BOOST_CHECK(!have_v4 || !ec);
|
|
|
|
const ip::address multicast_address_v6 =
|
|
ip::address::from_string("ff01::1", ec);
|
|
BOOST_CHECK(!have_v6 || !ec);
|
|
|
|
// join_group class.
|
|
|
|
if (have_v4)
|
|
{
|
|
ip::multicast::join_group join_group(multicast_address_v4);
|
|
sock_v4.set_option(join_group, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
}
|
|
|
|
if (have_v6)
|
|
{
|
|
ip::multicast::join_group join_group(multicast_address_v6);
|
|
sock_v6.set_option(join_group, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
}
|
|
|
|
// leave_group class.
|
|
|
|
if (have_v4)
|
|
{
|
|
ip::multicast::leave_group leave_group(multicast_address_v4);
|
|
sock_v4.set_option(leave_group, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
}
|
|
|
|
if (have_v6)
|
|
{
|
|
ip::multicast::leave_group leave_group(multicast_address_v6);
|
|
sock_v6.set_option(leave_group, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
}
|
|
|
|
// outbound_interface class.
|
|
|
|
if (have_v4)
|
|
{
|
|
ip::multicast::outbound_interface outbound_interface(
|
|
ip::address_v4::loopback());
|
|
sock_v4.set_option(outbound_interface, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
}
|
|
|
|
if (have_v6)
|
|
{
|
|
#if defined(__hpux)
|
|
ip::multicast::outbound_interface outbound_interface(if_nametoindex("lo0"));
|
|
#else
|
|
ip::multicast::outbound_interface outbound_interface(1);
|
|
#endif
|
|
sock_v6.set_option(outbound_interface, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
}
|
|
|
|
// hops class.
|
|
|
|
if (have_v4)
|
|
{
|
|
ip::multicast::hops hops1(1);
|
|
BOOST_CHECK(hops1.value() == 1);
|
|
sock_v4.set_option(hops1, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
|
|
ip::multicast::hops hops2;
|
|
sock_v4.get_option(hops2, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
BOOST_CHECK(hops2.value() == 1);
|
|
|
|
ip::multicast::hops hops3(0);
|
|
BOOST_CHECK(hops3.value() == 0);
|
|
sock_v4.set_option(hops3, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
|
|
ip::multicast::hops hops4;
|
|
sock_v4.get_option(hops4, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
BOOST_CHECK(hops4.value() == 0);
|
|
}
|
|
|
|
if (have_v6)
|
|
{
|
|
ip::multicast::hops hops1(1);
|
|
BOOST_CHECK(hops1.value() == 1);
|
|
sock_v6.set_option(hops1, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
|
|
ip::multicast::hops hops2;
|
|
sock_v6.get_option(hops2, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
BOOST_CHECK(hops2.value() == 1);
|
|
|
|
ip::multicast::hops hops3(0);
|
|
BOOST_CHECK(hops3.value() == 0);
|
|
sock_v6.set_option(hops3, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
|
|
ip::multicast::hops hops4;
|
|
sock_v6.get_option(hops4, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
BOOST_CHECK(hops4.value() == 0);
|
|
}
|
|
|
|
// enable_loopback class.
|
|
|
|
if (have_v4)
|
|
{
|
|
ip::multicast::enable_loopback enable_loopback1(true);
|
|
BOOST_CHECK(enable_loopback1.value());
|
|
BOOST_CHECK(static_cast<bool>(enable_loopback1));
|
|
BOOST_CHECK(!!enable_loopback1);
|
|
sock_v4.set_option(enable_loopback1, ec);
|
|
#if defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
// Option is not supported under Windows CE.
|
|
BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
|
|
ec.value() << ", " << ec.message());
|
|
#else // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
#endif // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
|
|
ip::multicast::enable_loopback enable_loopback2;
|
|
sock_v4.get_option(enable_loopback2, ec);
|
|
#if defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
// Not supported under Windows CE but can get value.
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
#else // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
BOOST_CHECK(enable_loopback2.value());
|
|
BOOST_CHECK(static_cast<bool>(enable_loopback2));
|
|
BOOST_CHECK(!!enable_loopback2);
|
|
#endif // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
|
|
ip::multicast::enable_loopback enable_loopback3(false);
|
|
BOOST_CHECK(!enable_loopback3.value());
|
|
BOOST_CHECK(!static_cast<bool>(enable_loopback3));
|
|
BOOST_CHECK(!enable_loopback3);
|
|
sock_v4.set_option(enable_loopback3, ec);
|
|
#if defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
// Option is not supported under Windows CE.
|
|
BOOST_CHECK_MESSAGE(ec == boost::asio::error::no_protocol_option,
|
|
ec.value() << ", " << ec.message());
|
|
#else // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
#endif // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
|
|
ip::multicast::enable_loopback enable_loopback4;
|
|
sock_v4.get_option(enable_loopback4, ec);
|
|
#if defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
// Not supported under Windows CE but can get value.
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
#else // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
BOOST_CHECK(!enable_loopback4.value());
|
|
BOOST_CHECK(!static_cast<bool>(enable_loopback4));
|
|
BOOST_CHECK(!enable_loopback4);
|
|
#endif // defined(BOOST_WINDOWS) && defined(UNDER_CE)
|
|
}
|
|
|
|
if (have_v6)
|
|
{
|
|
ip::multicast::enable_loopback enable_loopback1(true);
|
|
BOOST_CHECK(enable_loopback1.value());
|
|
BOOST_CHECK(static_cast<bool>(enable_loopback1));
|
|
BOOST_CHECK(!!enable_loopback1);
|
|
sock_v6.set_option(enable_loopback1, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
|
|
ip::multicast::enable_loopback enable_loopback2;
|
|
sock_v6.get_option(enable_loopback2, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
BOOST_CHECK(enable_loopback2.value());
|
|
BOOST_CHECK(static_cast<bool>(enable_loopback2));
|
|
BOOST_CHECK(!!enable_loopback2);
|
|
|
|
ip::multicast::enable_loopback enable_loopback3(false);
|
|
BOOST_CHECK(!enable_loopback3.value());
|
|
BOOST_CHECK(!static_cast<bool>(enable_loopback3));
|
|
BOOST_CHECK(!enable_loopback3);
|
|
sock_v6.set_option(enable_loopback3, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
|
|
ip::multicast::enable_loopback enable_loopback4;
|
|
sock_v6.get_option(enable_loopback4, ec);
|
|
BOOST_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
|
|
BOOST_CHECK(!enable_loopback4.value());
|
|
BOOST_CHECK(!static_cast<bool>(enable_loopback4));
|
|
BOOST_CHECK(!enable_loopback4);
|
|
}
|
|
}
|
|
|
|
} // namespace ip_multicast_runtime
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
test_suite* init_unit_test_suite(int, char*[])
|
|
{
|
|
test_suite* test = BOOST_TEST_SUITE("ip/multicast");
|
|
test->add(BOOST_TEST_CASE(&ip_multicast_compile::test));
|
|
test->add(BOOST_TEST_CASE(&ip_multicast_runtime::test));
|
|
return test;
|
|
}
|