diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-06-25 22:59:01 +0000 |
---|---|---|
committer | <> | 2013-09-27 11:49:28 +0000 |
commit | 8c4528713d907ee2cfd3bfcbbad272c749867f84 (patch) | |
tree | c09e2ce80f47b90c85cc720f5139089ad9c8cfff /libs/asio/example/cpp03/multicast | |
download | boost-tarball-baserock/morph.tar.gz |
Imported from /home/lorry/working-area/delta_boost-tarball/boost_1_54_0.tar.bz2.boost_1_54_0baserock/morph
Diffstat (limited to 'libs/asio/example/cpp03/multicast')
-rw-r--r-- | libs/asio/example/cpp03/multicast/Jamfile | 45 | ||||
-rw-r--r-- | libs/asio/example/cpp03/multicast/Jamfile.v2 | 41 | ||||
-rw-r--r-- | libs/asio/example/cpp03/multicast/receiver.cpp | 93 | ||||
-rw-r--r-- | libs/asio/example/cpp03/multicast/sender.cpp | 99 |
4 files changed, 278 insertions, 0 deletions
diff --git a/libs/asio/example/cpp03/multicast/Jamfile b/libs/asio/example/cpp03/multicast/Jamfile new file mode 100644 index 000000000..d2224d936 --- /dev/null +++ b/libs/asio/example/cpp03/multicast/Jamfile @@ -0,0 +1,45 @@ +# +# Copyright (c) 2003-2013 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) +# + +subproject libs/asio/example/multicast ; + +project boost : $(BOOST_ROOT) ; + +if $(UNIX) +{ + switch $(JAMUNAME) + { + case SunOS* : + { + SOCKET_LIBS = <find-library>socket <find-library>nsl ; + } + } +} + +exe receiver + : <lib>@boost/libs/system/build/boost_system + receiver.cpp + : <include>$(BOOST_ROOT) + <include>../../../.. + <define>BOOST_ALL_NO_LIB=1 + <threading>multi + <mingw><*><find-library>ws2_32 + <mingw><*><find-library>mswsock + $(SOCKET_LIBS) + ; + +exe sender + : <lib>@boost/libs/system/build/boost_system + sender.cpp + : <include>$(BOOST_ROOT) + <include>../../../.. + <define>BOOST_ALL_NO_LIB=1 + <threading>multi + <mingw><*><find-library>ws2_32 + <mingw><*><find-library>mswsock + $(SOCKET_LIBS) + ; diff --git a/libs/asio/example/cpp03/multicast/Jamfile.v2 b/libs/asio/example/cpp03/multicast/Jamfile.v2 new file mode 100644 index 000000000..ab6064934 --- /dev/null +++ b/libs/asio/example/cpp03/multicast/Jamfile.v2 @@ -0,0 +1,41 @@ +# +# Copyright (c) 2003-2013 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) +# + +import os ; + +if [ os.name ] = SOLARIS +{ + lib socket ; + lib nsl ; +} +else if [ os.name ] = NT +{ + lib ws2_32 ; + lib mswsock ; +} +else if [ os.name ] = HPUX +{ + lib ipv6 ; +} + +project + : requirements + <library>/boost/system//boost_system + <define>BOOST_ALL_NO_LIB=1 + <threading>multi + <os>SOLARIS:<library>socket + <os>SOLARIS:<library>nsl + <os>NT:<define>_WIN32_WINNT=0x0501 + <os>NT,<toolset>gcc:<library>ws2_32 + <os>NT,<toolset>gcc:<library>mswsock + <os>NT,<toolset>gcc-cygwin:<define>__USE_W32_SOCKETS + <os>HPUX,<toolset>gcc:<define>_XOPEN_SOURCE_EXTENDED + <os>HPUX:<library>ipv6 + ; + +exe receiver : receiver.cpp ; +exe sender : sender.cpp ; diff --git a/libs/asio/example/cpp03/multicast/receiver.cpp b/libs/asio/example/cpp03/multicast/receiver.cpp new file mode 100644 index 000000000..00c4f4a99 --- /dev/null +++ b/libs/asio/example/cpp03/multicast/receiver.cpp @@ -0,0 +1,93 @@ +// +// receiver.cpp +// ~~~~~~~~~~~~ +// +// Copyright (c) 2003-2013 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) +// + +#include <iostream> +#include <string> +#include <boost/asio.hpp> +#include "boost/bind.hpp" + +const short multicast_port = 30001; + +class receiver +{ +public: + receiver(boost::asio::io_service& io_service, + const boost::asio::ip::address& listen_address, + const boost::asio::ip::address& multicast_address) + : socket_(io_service) + { + // Create the socket so that multiple may be bound to the same address. + 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)); + } + + void handle_receive_from(const boost::system::error_code& error, + size_t bytes_recvd) + { + if (!error) + { + std::cout.write(data_, bytes_recvd); + std::cout << std::endl; + + 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)); + } + } + +private: + boost::asio::ip::udp::socket socket_; + boost::asio::ip::udp::endpoint sender_endpoint_; + enum { max_length = 1024 }; + char data_[max_length]; +}; + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 3) + { + std::cerr << "Usage: receiver <listen_address> <multicast_address>\n"; + std::cerr << " For IPv4, try:\n"; + std::cerr << " receiver 0.0.0.0 239.255.0.1\n"; + std::cerr << " For IPv6, try:\n"; + std::cerr << " receiver 0::0 ff31::8000:1234\n"; + return 1; + } + + boost::asio::io_service io_service; + receiver r(io_service, + boost::asio::ip::address::from_string(argv[1]), + boost::asio::ip::address::from_string(argv[2])); + io_service.run(); + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +} diff --git a/libs/asio/example/cpp03/multicast/sender.cpp b/libs/asio/example/cpp03/multicast/sender.cpp new file mode 100644 index 000000000..cddd515a9 --- /dev/null +++ b/libs/asio/example/cpp03/multicast/sender.cpp @@ -0,0 +1,99 @@ +// +// sender.cpp +// ~~~~~~~~~~ +// +// Copyright (c) 2003-2013 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) +// + +#include <iostream> +#include <sstream> +#include <string> +#include <boost/asio.hpp> +#include "boost/bind.hpp" +#include "boost/date_time/posix_time/posix_time_types.hpp" + +const short multicast_port = 30001; +const int max_message_count = 10; + +class sender +{ +public: + sender(boost::asio::io_service& io_service, + const boost::asio::ip::address& multicast_address) + : endpoint_(multicast_address, multicast_port), + socket_(io_service, endpoint_.protocol()), + timer_(io_service), + message_count_(0) + { + std::ostringstream os; + os << "Message " << message_count_++; + message_ = os.str(); + + socket_.async_send_to( + boost::asio::buffer(message_), endpoint_, + boost::bind(&sender::handle_send_to, this, + boost::asio::placeholders::error)); + } + + void handle_send_to(const boost::system::error_code& error) + { + if (!error && message_count_ < max_message_count) + { + timer_.expires_from_now(boost::posix_time::seconds(1)); + timer_.async_wait( + boost::bind(&sender::handle_timeout, this, + boost::asio::placeholders::error)); + } + } + + void handle_timeout(const boost::system::error_code& error) + { + if (!error) + { + std::ostringstream os; + os << "Message " << message_count_++; + message_ = os.str(); + + socket_.async_send_to( + boost::asio::buffer(message_), endpoint_, + boost::bind(&sender::handle_send_to, this, + boost::asio::placeholders::error)); + } + } + +private: + boost::asio::ip::udp::endpoint endpoint_; + boost::asio::ip::udp::socket socket_; + boost::asio::deadline_timer timer_; + int message_count_; + std::string message_; +}; + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 2) + { + std::cerr << "Usage: sender <multicast_address>\n"; + std::cerr << " For IPv4, try:\n"; + std::cerr << " sender 239.255.0.1\n"; + std::cerr << " For IPv6, try:\n"; + std::cerr << " sender ff31::8000:1234\n"; + return 1; + } + + boost::asio::io_service io_service; + sender s(io_service, boost::asio::ip::address::from_string(argv[1])); + io_service.run(); + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +} |