[/
 / Copyright (c) 2003-2014 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)
 /]

[section:tutorial Tutorial]

[heading Basic Skills]

The tutorial programs in this first section introduce the fundamental concepts required to use the asio toolkit. Before plunging into the complex world of network programming, these tutorial programs illustrate the basic skills using simple asynchronous timers.

* [link asio.tutorial.tuttimer1 Timer.1 - Using a timer synchronously]


* [link asio.tutorial.tuttimer2 Timer.2 - Using a timer asynchronously]


* [link asio.tutorial.tuttimer3 Timer.3 - Binding arguments to a handler]


* [link asio.tutorial.tuttimer4 Timer.4 - Using a member function as a handler]


* [link asio.tutorial.tuttimer5 Timer.5 - Synchronising handlers in multithreaded programs]




[heading Introduction to Sockets]

The tutorial programs in this section show how to use asio to develop simple client and server programs. These tutorial programs are based around the [@http://www.ietf.org/rfc/rfc867.txt daytime] protocol, which supports both TCP and UDP.

The first three tutorial programs implement the daytime protocol using TCP.

* [link asio.tutorial.tutdaytime1 Daytime.1 - A synchronous TCP daytime client]


* [link asio.tutorial.tutdaytime2 Daytime.2 - A synchronous TCP daytime server]


* [link asio.tutorial.tutdaytime3 Daytime.3 - An asynchronous TCP daytime server]



The next three tutorial programs implement the daytime protocol using UDP.

* [link asio.tutorial.tutdaytime4 Daytime.4 - A synchronous UDP daytime client]


* [link asio.tutorial.tutdaytime5 Daytime.5 - A synchronous UDP daytime server]


* [link asio.tutorial.tutdaytime6 Daytime.6 - An asynchronous UDP daytime server]



The last tutorial program in this section demonstrates how asio allows the TCP and UDP servers to be easily combined into a single program.

* [link asio.tutorial.tutdaytime7 Daytime.7 - A combined TCP/UDP asynchronous server]




[section:tuttimer1 Timer.1 - Using a timer synchronously]

This tutorial program introduces asio by showing how to perform a blocking wait on a timer.





We start by including the necessary header files.

All of the asio classes can be used by simply including the `"asio.hpp"` header file.


  ``''''''``#include <iostream>
  ``''''''``#include <asio.hpp>



Since this example uses timers, we need to include the appropriate Boost.Date\_Time header file for manipulating times.


  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>



All programs that use asio need to have at least one 
[link asio.reference.io_service io_service] object. This class provides access to I/O functionality. We declare an object of this type first thing in the main function.



  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;



Next we declare an object of type asio::deadline\_timer. The core asio classes that provide I/O functionality (or as in this case timer functionality) always take a reference to an io\_service as their first constructor argument. The second argument to the constructor sets the timer to expire 5 seconds from now.



  ``''''''``  asio::deadline_timer t(io, boost::posix_time::seconds(5));



In this simple example we perform a blocking wait on the timer. That is, the call to [link asio.reference.basic_deadline_timer.wait deadline_timer::wait()] will not return until the timer has expired, 5 seconds after it was created (i.e. not from when the wait starts).

A deadline timer is always in one of two states: "expired" or "not expired". If the [link asio.reference.basic_deadline_timer.wait deadline_timer::wait()] function is called on an expired timer, it will return immediately.


  ``''''''``  t.wait();



Finally we print the obligatory `"Hello, world!"` message to show when the timer has expired.



  ``''''''``  std::cout << "Hello, world!\n";

  ``''''''``  return 0;
  ``''''''``}



See the [link asio.tutorial.tuttimer1.src full source listing]

Return to the [link asio.tutorial tutorial index]

Next: [link asio.tutorial.tuttimer2 Timer.2 - Using a timer asynchronously]



[section:src Source listing for Timer.1]


  ``''''''``//
  ``''''''``// timer.cpp
  ``''''''``// ~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <asio.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>

  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;

  ``''''''``  asio::deadline_timer t(io, boost::posix_time::seconds(5));
  ``''''''``  t.wait();

  ``''''''``  std::cout << "Hello, world!\n";

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tuttimer1 Timer.1 - Using a timer synchronously]

[endsect]

[endsect]

[section:tuttimer2 Timer.2 - Using a timer asynchronously]

This tutorial program demonstrates how to use asio's asynchronous callback functionality by modifying the program from tutorial Timer.1 to perform an asynchronous wait on the timer.






  ``''''''``#include <iostream>
  ``''''''``#include <asio.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>



Using asio's asynchronous functionality means having a callback function that will be called when an asynchronous operation completes. In this program we define a function called `print` to be called when the asynchronous wait finishes.



  ``''''''``void print(const asio::error_code& /*e*/)
  ``''''''``{
  ``''''''``  std::cout << "Hello, world!\n";
  ``''''''``}

  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;

  ``''''''``  asio::deadline_timer t(io, boost::posix_time::seconds(5));



Next, instead of doing a blocking wait as in tutorial Timer.1, we call the [link asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()] function to perform an asynchronous wait. When calling this function we pass the `print` callback handler that was defined above.


  ``''''''``  t.async_wait(&print);



Finally, we must call the [link asio.reference.io_service.run io_service::run()] member function on the io\_service object.

The asio library provides a guarantee that callback handlers will only be called from threads that are currently calling [link asio.reference.io_service.run io_service::run()]. Therefore unless the [link asio.reference.io_service.run io_service::run()] function is called the callback for the asynchronous wait completion will never be invoked.

The [link asio.reference.io_service.run io_service::run()] function will also continue to run while there is still "work" to do. In this example, the work is the asynchronous wait on the timer, so the call will not return until the timer has expired and the callback has completed.

It is important to remember to give the io\_service some work to do before calling [link asio.reference.io_service.run io_service::run()]. For example, if we had omitted the above call to [link asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()], the io\_service would not have had any work to do, and consequently [link asio.reference.io_service.run io_service::run()] would have returned immediately.


  ``''''''``  io.run();

  ``''''''``  return 0;
  ``''''''``}



See the [link asio.tutorial.tuttimer2.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tuttimer1 Timer.1 - Using a timer synchronously]

Next: [link asio.tutorial.tuttimer3 Timer.3 - Binding arguments to a handler]



[section:src Source listing for Timer.2]


  ``''''''``//
  ``''''''``// timer.cpp
  ``''''''``// ~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <asio.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>

  ``''''''``void print(const asio::error_code& /*e*/)
  ``''''''``{
  ``''''''``  std::cout << "Hello, world!\n";
  ``''''''``}

  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;

  ``''''''``  asio::deadline_timer t(io, boost::posix_time::seconds(5));
  ``''''''``  t.async_wait(&print);

  ``''''''``  io.run();

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tuttimer2 Timer.2 - Using a timer asynchronously]

[endsect]

[endsect]

[section:tuttimer3 Timer.3 - Binding arguments to a handler]

In this tutorial we will modify the program from tutorial Timer.2 so that the timer fires once a second. This will show how to pass additional parameters to your handler function.






  ``''''''``#include <iostream>
  ``''''''``#include <asio.hpp>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>



To implement a repeating timer using asio you need to change the timer's expiry time in your callback function, and to then start a new asynchronous wait. Obviously this means that the callback function will need to be able to access the timer object. To this end we add two new parameters to the `print` function:

* A pointer to a timer object.


* A counter so that we can stop the program when the timer fires for the sixth time.




  ``''''''``void print(const asio::error_code& /*e*/,
  ``''''''``    asio::deadline_timer* t, int* count)
  ``''''''``{



As mentioned above, this tutorial program uses a counter to stop running when the timer fires for the sixth time. However you will observe that there is no explicit call to ask the io\_service to stop. Recall that in tutorial Timer.2 we learnt that the [link asio.reference.io_service.run io_service::run()] function completes when there is no more "work" to do. By not starting a new asynchronous wait on the timer when `count` reaches 5, the io\_service will run out of work and stop running.


  ``''''''``  if (*count < 5)
  ``''''''``  {
  ``''''''``    std::cout << *count << "\n";
  ``''''''``    ++(*count);



Next we move the expiry time for the timer along by one second from the previous expiry time. By calculating the new expiry time relative to the old, we can ensure that the timer does not drift away from the whole-second mark due to any delays in processing the handler.



  ``''''''``    t->expires_at(t->expires_at() + boost::posix_time::seconds(1));



Then we start a new asynchronous wait on the timer. As you can see, the [link asio.tutorial.boost_bind boost::bind]  function is used to associate the extra parameters with your callback handler. The [link asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()] function expects a handler function (or function object) with the signature `void(const asio::error_code&)`. Binding the additional parameters converts your `print` function into a function object that matches the signature correctly.

See the [@http://www.boost.org/libs/bind/bind.html Boost.Bind documentation] for more information on how to use [link asio.tutorial.boost_bind boost::bind] .

In this example, the asio::placeholders::error argument to [link asio.tutorial.boost_bind boost::bind]  is a named placeholder for the error object passed to the handler. When initiating the asynchronous operation, and if using [link asio.tutorial.boost_bind boost::bind] , you must specify only the arguments that match the handler's parameter list. In tutorial Timer.4 you will see that this placeholder may be elided if the parameter is not needed by the callback handler.


  ``''''''``    t->async_wait(boost::bind(print,
  ``''''''``          asio::placeholders::error, t, count));
  ``''''''``  }
  ``''''''``}

  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;



A new `count` variable is added so that we can stop the program when the timer fires for the sixth time.



  ``''''''``  int count = 0;
  ``''''''``  asio::deadline_timer t(io, boost::posix_time::seconds(1));



As in Step 4, when making the call to [link asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()] from `main` we bind the additional parameters needed for the `print` function.


  ``''''''``  t.async_wait(boost::bind(print,
  ``''''''``        asio::placeholders::error, &t, &count));

  ``''''''``  io.run();



Finally, just to prove that the `count` variable was being used in the `print` handler function, we will print out its new value.



  ``''''''``  std::cout << "Final count is " << count << "\n";

  ``''''''``  return 0;
  ``''''''``}



See the [link asio.tutorial.tuttimer3.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tuttimer2 Timer.2 - Using a timer asynchronously]

Next: [link asio.tutorial.tuttimer4 Timer.4 - Using a member function as a handler]



[section:src Source listing for Timer.3]


  ``''''''``//
  ``''''''``// timer.cpp
  ``''''''``// ~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <asio.hpp>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>

  ``''''''``void print(const asio::error_code& /*e*/,
  ``''''''``    asio::deadline_timer* t, int* count)
  ``''''''``{
  ``''''''``  if (*count < 5)
  ``''''''``  {
  ``''''''``    std::cout << *count << "\n";
  ``''''''``    ++(*count);

  ``''''''``    t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
  ``''''''``    t->async_wait(boost::bind(print,
  ``''''''``          asio::placeholders::error, t, count));
  ``''''''``  }
  ``''''''``}

  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;

  ``''''''``  int count = 0;
  ``''''''``  asio::deadline_timer t(io, boost::posix_time::seconds(1));
  ``''''''``  t.async_wait(boost::bind(print,
  ``''''''``        asio::placeholders::error, &t, &count));

  ``''''''``  io.run();

  ``''''''``  std::cout << "Final count is " << count << "\n";

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tuttimer3 Timer.3 - Binding arguments to a handler]

[endsect]

[endsect]

[section:tuttimer4 Timer.4 - Using a member function as a handler]

In this tutorial we will see how to use a class member function as a callback handler. The program should execute identically to the tutorial program from tutorial Timer.3.






  ``''''''``#include <iostream>
  ``''''''``#include <asio.hpp>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>



Instead of defining a free function `print` as the callback handler, as we did in the earlier tutorial programs, we now define a class called `printer`.



  ``''''''``class printer
  ``''''''``{
  ``''''''``public:



The constructor of this class will take a reference to the io\_service object and use it when initialising the `timer_` member. The counter used to shut down the program is now also a member of the class.


  ``''''''``  printer(asio::io_service& io)
  ``''''''``    : timer_(io, boost::posix_time::seconds(1)),
  ``''''''``      count_(0)
  ``''''''``  {



The [link asio.tutorial.boost_bind boost::bind]  function works just as well with class member functions as with free functions. Since all non-static class member functions have an implicit `this` parameter, we need to bind `this` to the function. As in tutorial Timer.3, [link asio.tutorial.boost_bind boost::bind]  converts our callback handler (now a member function) into a function object that can be invoked as though it has the signature `void(const asio::error_code&)`.

You will note that the asio::placeholders::error placeholder is not specified here, as the `print` member function does not accept an error object as a parameter.


  ``''''''``    timer_.async_wait(boost::bind(&printer::print, this));
  ``''''''``  }



In the class destructor we will print out the final value of the counter.



  ``''''''``  ~printer()
  ``''''''``  {
  ``''''''``    std::cout << "Final count is " << count_ << "\n";
  ``''''''``  }



The `print` member function is very similar to the `print` function from tutorial Timer.3, except that it now operates on the class data members instead of having the timer and counter passed in as parameters.



  ``''''''``  void print()
  ``''''''``  {
  ``''''''``    if (count_ < 5)
  ``''''''``    {
  ``''''''``      std::cout << count_ << "\n";
  ``''''''``      ++count_;

  ``''''''``      timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(1));
  ``''''''``      timer_.async_wait(boost::bind(&printer::print, this));
  ``''''''``    }
  ``''''''``  }

  ``''''''``private:
  ``''''''``  asio::deadline_timer timer_;
  ``''''''``  int count_;
  ``''''''``};



The `main` function is much simpler than before, as it now declares a local `printer` object before running the io\_service as normal.



  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;
  ``''''''``  printer p(io);
  ``''''''``  io.run();

  ``''''''``  return 0;
  ``''''''``}



See the [link asio.tutorial.tuttimer4.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tuttimer3 Timer.3 - Binding arguments to a handler]

Next: [link asio.tutorial.tuttimer5 Timer.5 - Synchronising handlers in multithreaded programs]





[section:src Source listing for Timer.4]


  ``''''''``//
  ``''''''``// timer.cpp
  ``''''''``// ~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <asio.hpp>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>

  ``''''''``class printer
  ``''''''``{
  ``''''''``public:
  ``''''''``  printer(asio::io_service& io)
  ``''''''``    : timer_(io, boost::posix_time::seconds(1)),
  ``''''''``      count_(0)
  ``''''''``  {
  ``''''''``    timer_.async_wait(boost::bind(&printer::print, this));
  ``''''''``  }

  ``''''''``  ~printer()
  ``''''''``  {
  ``''''''``    std::cout << "Final count is " << count_ << "\n";
  ``''''''``  }

  ``''''''``  void print()
  ``''''''``  {
  ``''''''``    if (count_ < 5)
  ``''''''``    {
  ``''''''``      std::cout << count_ << "\n";
  ``''''''``      ++count_;

  ``''''''``      timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(1));
  ``''''''``      timer_.async_wait(boost::bind(&printer::print, this));
  ``''''''``    }
  ``''''''``  }

  ``''''''``private:
  ``''''''``  asio::deadline_timer timer_;
  ``''''''``  int count_;
  ``''''''``};

  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;
  ``''''''``  printer p(io);
  ``''''''``  io.run();

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tuttimer4 Timer.4 - Using a member function as a handler]

[endsect]

[endsect]

[section:tuttimer5 Timer.5 - Synchronising handlers in multithreaded programs]

This tutorial demonstrates the use of the asio::strand class to synchronise callback handlers in a multithreaded program.

The previous four tutorials avoided the issue of handler synchronisation by calling the [link asio.reference.io_service.run io_service::run()] function from one thread only. As you already know, the asio library provides a guarantee that callback handlers will only be called from threads that are currently calling [link asio.reference.io_service.run io_service::run()]. Consequently, calling [link asio.reference.io_service.run io_service::run()] from only one thread ensures that callback handlers cannot run concurrently.

The single threaded approach is usually the best place to start when developing applications using asio. The downside is the limitations it places on programs, particularly servers, including:

* Poor responsiveness when handlers can take a long time to complete. 


* An inability to scale on multiprocessor systems. 




If you find yourself running into these limitations, an alternative approach is to have a pool of threads calling [link asio.reference.io_service.run io_service::run()]. However, as this allows handlers to execute concurrently, we need a method of synchronisation when handlers might be accessing a shared, thread-unsafe resource.






  ``''''''``#include <iostream>
  ``''''''``#include <asio.hpp>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>



We start by defining a class called `printer`, similar to the class in the previous tutorial. This class will extend the previous tutorial by running two timers in parallel.



  ``''''''``class printer
  ``''''''``{
  ``''''''``public:



In addition to initialising a pair of asio::deadline\_timer members, the constructor initialises the `strand_` member, an object of type asio::strand.

An asio::strand guarantees that, for those handlers that are dispatched through it, an executing handler will be allowed to complete before the next one is started. This is guaranteed irrespective of the number of threads that are calling [link asio.reference.io_service.run io_service::run()]. Of course, the handlers may still execute concurrently with other handlers that were not dispatched through an asio::strand, or were dispatched through a different asio::strand object.


  ``''''''``  printer(asio::io_service& io)
  ``''''''``    : strand_(io),
  ``''''''``      timer1_(io, boost::posix_time::seconds(1)),
  ``''''''``      timer2_(io, boost::posix_time::seconds(1)),
  ``''''''``      count_(0)
  ``''''''``  {



When initiating the asynchronous operations, each callback handler is "wrapped" using the asio::strand object. The [link asio.reference.io_service__strand.wrap strand::wrap()] function returns a new handler that automatically dispatches its contained handler through the asio::strand object. By wrapping the handlers using the same asio::strand, we are ensuring that they cannot execute concurrently.


  ``''''''``    timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
  ``''''''``    timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
  ``''''''``  }

  ``''''''``  ~printer()
  ``''''''``  {
  ``''''''``    std::cout << "Final count is " << count_ << "\n";
  ``''''''``  }



In a multithreaded program, the handlers for asynchronous operations should be synchronised if they access shared resources. In this tutorial, the shared resources used by the handlers (`print1` and `print2`) are `std::cout` and the `count_` data member.



  ``''''''``  void print1()
  ``''''''``  {
  ``''''''``    if (count_ < 10)
  ``''''''``    {
  ``''''''``      std::cout << "Timer 1: " << count_ << "\n";
  ``''''''``      ++count_;

  ``''''''``      timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
  ``''''''``      timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
  ``''''''``    }
  ``''''''``  }

  ``''''''``  void print2()
  ``''''''``  {
  ``''''''``    if (count_ < 10)
  ``''''''``    {
  ``''''''``      std::cout << "Timer 2: " << count_ << "\n";
  ``''''''``      ++count_;

  ``''''''``      timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
  ``''''''``      timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
  ``''''''``    }
  ``''''''``  }

  ``''''''``private:
  ``''''''``  asio::io_service::strand strand_;
  ``''''''``  asio::deadline_timer timer1_;
  ``''''''``  asio::deadline_timer timer2_;
  ``''''''``  int count_;
  ``''''''``};



The `main` function now causes [link asio.reference.io_service.run io_service::run()] to be called from two threads: the main thread and one additional thread. This is accomplished using an 
[link asio.reference.thread thread] object.

Just as it would with a call from a single thread, concurrent calls to [link asio.reference.io_service.run io_service::run()] will continue to execute while there is "work" left to do. The background thread will not exit until all asynchronous operations have completed.



  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;
  ``''''''``  printer p(io);
  ``''''''``  asio::thread t(boost::bind(&asio::io_service::run, &io));
  ``''''''``  io.run();
  ``''''''``  t.join();

  ``''''''``  return 0;
  ``''''''``}



See the [link asio.tutorial.tuttimer5.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tuttimer4 Timer.4 - Using a member function as a handler]





[section:src Source listing for Timer.5]


  ``''''''``//
  ``''''''``// timer.cpp
  ``''''''``// ~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <asio.hpp>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/date_time/posix_time/posix_time.hpp>

  ``''''''``class printer
  ``''''''``{
  ``''''''``public:
  ``''''''``  printer(asio::io_service& io)
  ``''''''``    : strand_(io),
  ``''''''``      timer1_(io, boost::posix_time::seconds(1)),
  ``''''''``      timer2_(io, boost::posix_time::seconds(1)),
  ``''''''``      count_(0)
  ``''''''``  {
  ``''''''``    timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
  ``''''''``    timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
  ``''''''``  }

  ``''''''``  ~printer()
  ``''''''``  {
  ``''''''``    std::cout << "Final count is " << count_ << "\n";
  ``''''''``  }

  ``''''''``  void print1()
  ``''''''``  {
  ``''''''``    if (count_ < 10)
  ``''''''``    {
  ``''''''``      std::cout << "Timer 1: " << count_ << "\n";
  ``''''''``      ++count_;

  ``''''''``      timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
  ``''''''``      timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
  ``''''''``    }
  ``''''''``  }

  ``''''''``  void print2()
  ``''''''``  {
  ``''''''``    if (count_ < 10)
  ``''''''``    {
  ``''''''``      std::cout << "Timer 2: " << count_ << "\n";
  ``''''''``      ++count_;

  ``''''''``      timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
  ``''''''``      timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2, this)));
  ``''''''``    }
  ``''''''``  }

  ``''''''``private:
  ``''''''``  asio::io_service::strand strand_;
  ``''''''``  asio::deadline_timer timer1_;
  ``''''''``  asio::deadline_timer timer2_;
  ``''''''``  int count_;
  ``''''''``};

  ``''''''``int main()
  ``''''''``{
  ``''''''``  asio::io_service io;
  ``''''''``  printer p(io);
  ``''''''``  asio::thread t(boost::bind(&asio::io_service::run, &io));
  ``''''''``  io.run();
  ``''''''``  t.join();

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tuttimer5 Timer.5 - Synchronising handlers in multithreaded programs]

[endsect]

[endsect]

[section:tutdaytime1 Daytime.1 - A synchronous TCP daytime client]

This tutorial program shows how to use asio to implement a client application with TCP.





We start by including the necessary header files.


  ``''''''``#include <iostream>
  ``''''''``#include <boost/array.hpp>
  ``''''''``#include <asio.hpp>



The purpose of this application is to access a daytime service, so we need the user to specify the server.



  ``''''''``using asio::ip::tcp;

  ``''''''``int main(int argc, char* argv[])
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    if (argc != 2)
  ``''''''``    {
  ``''''''``      std::cerr << "Usage: client <host>" << std::endl;
  ``''''''``      return 1;
  ``''''''``    }



All programs that use asio need to have at least one 
[link asio.reference.io_service io_service] object.



  ``''''''``    asio::io_service io_service;



We need to turn the server name that was specified as a parameter to the application, into a TCP endpoint. To do this we use an [link asio.reference.ip__tcp.resolver ip::tcp::resolver] object.



  ``''''''``    tcp::resolver resolver(io_service);



A resolver takes a query object and turns it into a list of endpoints. We construct a query using the name of the server, specified in `argv[1]`, and the name of the service, in this case `"daytime"`.


  ``''''''``    tcp::resolver::query query(argv[1], "daytime");



The list of endpoints is returned using an iterator of type [link asio.reference.ip__basic_resolver.iterator ip::tcp::resolver::iterator]. (Note that a default constructed [link asio.reference.ip__basic_resolver.iterator ip::tcp::resolver::iterator] object can be used as an end iterator.)


  ``''''''``    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);



Now we create and connect the socket. The list of endpoints obtained above may contain both IPv4 and IPv6 endpoints, so we need to try each of them until we find one that works. This keeps the client program independent of a specific IP version. The asio::connect() function does this for us automatically.



  ``''''''``    tcp::socket socket(io_service);
  ``''''''``    asio::connect(socket, endpoint_iterator);



The connection is open. All we need to do now is read the response from the daytime service.

We use a `boost::array` to hold the received data. The asio::buffer() function automatically determines the size of the array to help prevent buffer overruns. Instead of a `boost::array`, we could have used a `char []` or `std::vector`.



  ``''''''``    for (;;)
  ``''''''``    {
  ``''''''``      boost::array<char, 128> buf;
  ``''''''``      asio::error_code error;

  ``''''''``      size_t len = socket.read_some(asio::buffer(buf), error);



When the server closes the connection, the [link asio.reference.basic_stream_socket.read_some ip::tcp::socket::read_some()] function will exit with the asio::error::eof error, which is how we know to exit the loop.



  ``''''''``      if (error == asio::error::eof)
  ``''''''``        break; // Connection closed cleanly by peer.
  ``''''''``      else if (error)
  ``''''''``        throw asio::system_error(error); // Some other error.

  ``''''''``      std::cout.write(buf.data(), len);
  ``''''''``    }



Finally, handle any exceptions that may have been thrown.


  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }



See the [link asio.tutorial.tutdaytime1.src full source listing]

Return to the [link asio.tutorial tutorial index]

Next: [link asio.tutorial.tutdaytime2 Daytime.2 - A synchronous TCP daytime server]



[section:src Source listing for Daytime.1]


  ``''''''``//
  ``''''''``// client.cpp
  ``''''''``// ~~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <boost/array.hpp>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::tcp;

  ``''''''``int main(int argc, char* argv[])
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    if (argc != 2)
  ``''''''``    {
  ``''''''``      std::cerr << "Usage: client <host>" << std::endl;
  ``''''''``      return 1;
  ``''''''``    }

  ``''''''``    asio::io_service io_service;

  ``''''''``    tcp::resolver resolver(io_service);
  ``''''''``    tcp::resolver::query query(argv[1], "daytime");
  ``''''''``    tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);

  ``''''''``    tcp::socket socket(io_service);
  ``''''''``    asio::connect(socket, endpoint_iterator);

  ``''''''``    for (;;)
  ``''''''``    {
  ``''''''``      boost::array<char, 128> buf;
  ``''''''``      asio::error_code error;

  ``''''''``      size_t len = socket.read_some(asio::buffer(buf), error);

  ``''''''``      if (error == asio::error::eof)
  ``''''''``        break; // Connection closed cleanly by peer.
  ``''''''``      else if (error)
  ``''''''``        throw asio::system_error(error); // Some other error.

  ``''''''``      std::cout.write(buf.data(), len);
  ``''''''``    }
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tutdaytime1 Daytime.1 - A synchronous TCP daytime client]

[endsect]

[endsect]

[section:tutdaytime2 Daytime.2 - A synchronous TCP daytime server]

This tutorial program shows how to use asio to implement a server application with TCP.






  ``''''''``#include <ctime>
  ``''''''``#include <iostream>
  ``''''''``#include <string>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::tcp;



We define the function `make_daytime_string()` to create the string to be sent back to the client. This function will be reused in all of our daytime server applications.



  ``''''''``std::string make_daytime_string()
  ``''''''``{
  ``''''''``  using namespace std; // For time_t, time and ctime;
  ``''''''``  time_t now = time(0);
  ``''''''``  return ctime(&now);
  ``''''''``}

  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    asio::io_service io_service;



A [link asio.reference.ip__tcp.acceptor ip::tcp::acceptor] object needs to be created to listen for new connections. It is initialised to listen on TCP port 13, for IP version 4.



  ``''''''``    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));



This is an iterative server, which means that it will handle one connection at a time. Create a socket that will represent the connection to the client, and then wait for a connection.



  ``''''''``    for (;;)
  ``''''''``    {
  ``''''''``      tcp::socket socket(io_service);
  ``''''''``      acceptor.accept(socket);



A client is accessing our service. Determine the current time and transfer this information to the client.



  ``''''''``      std::string message = make_daytime_string();

  ``''''''``      asio::error_code ignored_error;
  ``''''''``      asio::write(socket, asio::buffer(message), ignored_error);
  ``''''''``    }
  ``''''''``  }



Finally, handle any exceptions.


  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}



See the [link asio.tutorial.tutdaytime2.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tutdaytime1 Daytime.1 - A synchronous TCP daytime client]

Next: [link asio.tutorial.tutdaytime3 Daytime.3 - An asynchronous TCP daytime server]



[section:src Source listing for Daytime.2]


  ``''''''``//
  ``''''''``// server.cpp
  ``''''''``// ~~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <ctime>
  ``''''''``#include <iostream>
  ``''''''``#include <string>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::tcp;

  ``''''''``std::string make_daytime_string()
  ``''''''``{
  ``''''''``  using namespace std; // For time_t, time and ctime;
  ``''''''``  time_t now = time(0);
  ``''''''``  return ctime(&now);
  ``''''''``}

  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    asio::io_service io_service;

  ``''''''``    tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));

  ``''''''``    for (;;)
  ``''''''``    {
  ``''''''``      tcp::socket socket(io_service);
  ``''''''``      acceptor.accept(socket);

  ``''''''``      std::string message = make_daytime_string();

  ``''''''``      asio::error_code ignored_error;
  ``''''''``      asio::write(socket, asio::buffer(message), ignored_error);
  ``''''''``    }
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tutdaytime2 Daytime.2 - A synchronous TCP daytime server]

[endsect]

[endsect]

[section:tutdaytime3 Daytime.3 - An asynchronous TCP daytime server]

[heading The main() function]


  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {



We need to create a server object to accept incoming client connections. The 
[link asio.reference.io_service io_service] object provides I/O services, such as sockets, that the server object will use.


  ``''''''``    asio::io_service io_service;
  ``''''''``    tcp_server server(io_service);



Run the 
[link asio.reference.io_service io_service] object so that it will perform asynchronous operations on your behalf.


  ``''''''``    io_service.run();
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}



[heading The tcp_server class]


  ``''''''``class tcp_server
  ``''''''``{
  ``''''''``public:



The constructor initialises an acceptor to listen on TCP port 13.


  ``''''''``  tcp_server(asio::io_service& io_service)
  ``''''''``    : acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))
  ``''''''``  {
  ``''''''``    start_accept();
  ``''''''``  }

  ``''''''``private:



The function `start_accept()` creates a socket and initiates an asynchronous accept operation to wait for a new connection.


  ``''''''``  void start_accept()
  ``''''''``  {
  ``''''''``    tcp_connection::pointer new_connection =
  ``''''''``      tcp_connection::create(acceptor_.get_io_service());

  ``''''''``    acceptor_.async_accept(new_connection->socket(),
  ``''''''``        boost::bind(&tcp_server::handle_accept, this, new_connection,
  ``''''''``          asio::placeholders::error));
  ``''''''``  }



The function `handle_accept()` is called when the asynchronous accept operation initiated by `start_accept()` finishes. It services the client request, and then calls `start_accept()` to initiate the next accept operation.



  ``''''''``  void handle_accept(tcp_connection::pointer new_connection,
  ``''''''``      const asio::error_code& error)
  ``''''''``  {
  ``''''''``    if (!error)
  ``''''''``    {
  ``''''''``      new_connection->start();
  ``''''''``    }

  ``''''''``    start_accept();
  ``''''''``  }



[heading The tcp_connection class]

We will use `shared_ptr` and `enable_shared_from_this` because we want to keep the `tcp_connection` object alive as long as there is an operation that refers to it.


  ``''''''``class tcp_connection
  ``''''''``  : public boost::enable_shared_from_this<tcp_connection>
  ``''''''``{
  ``''''''``public:
  ``''''''``  typedef boost::shared_ptr<tcp_connection> pointer;

  ``''''''``  static pointer create(asio::io_service& io_service)
  ``''''''``  {
  ``''''''``    return pointer(new tcp_connection(io_service));
  ``''''''``  }

  ``''''''``  tcp::socket& socket()
  ``''''''``  {
  ``''''''``    return socket_;
  ``''''''``  }



In the function `start()`, we call asio::async\_write() to serve the data to the client. Note that we are using asio::async\_write(), rather than [link asio.reference.basic_stream_socket.async_write_some ip::tcp::socket::async_write_some()], to ensure that the entire block of data is sent.



  ``''''''``  void start()
  ``''''''``  {



The data to be sent is stored in the class member `message_` as we need to keep the data valid until the asynchronous operation is complete.


  ``''''''``    message_ = make_daytime_string();



When initiating the asynchronous operation, and if using [link asio.tutorial.boost_bind boost::bind] , you must specify only the arguments that match the handler's parameter list. In this program, both of the argument placeholders (asio::placeholders::error and asio::placeholders::bytes\_transferred) could potentially have been removed, since they are not being used in `handle_write()`.



  ``''''''``    asio::async_write(socket_, asio::buffer(message_),
  ``''''''``        boost::bind(&tcp_connection::handle_write, shared_from_this(),
  ``''''''``          asio::placeholders::error,
  ``''''''``          asio::placeholders::bytes_transferred));



Any further actions for this client connection are now the responsibility of `handle_write()`.


  ``''''''``  }

  ``''''''``private:
  ``''''''``  tcp_connection(asio::io_service& io_service)
  ``''''''``    : socket_(io_service)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  void handle_write(const asio::error_code& /*error*/,
  ``''''''``      size_t /*bytes_transferred*/)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  tcp::socket socket_;
  ``''''''``  std::string message_;
  ``''''''``};



[heading Removing unused handler parameters]

You may have noticed that the `error`, and `bytes_transferred` parameters are not used in the body of the `handle_write()` function. If parameters are not needed, it is possible to remove them from the function so that it looks like:


  ``''''''``  void handle_write()
  ``''''''``  {
  ``''''''``  }



The asio::async\_write() call used to initiate the call can then be changed to just:


  ``''''''``  asio::async_write(socket_, asio::buffer(message_),
  ``''''''``      boost::bind(&tcp_connection::handle_write, shared_from_this()));



See the [link asio.tutorial.tutdaytime3.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tutdaytime2 Daytime.2 - A synchronous TCP daytime server]

Next: [link asio.tutorial.tutdaytime4 Daytime.4 - A synchronous UDP daytime client]



[section:src Source listing for Daytime.3]


  ``''''''``//
  ``''''''``// server.cpp
  ``''''''``// ~~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <ctime>
  ``''''''``#include <iostream>
  ``''''''``#include <string>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/shared_ptr.hpp>
  ``''''''``#include <boost/enable_shared_from_this.hpp>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::tcp;

  ``''''''``std::string make_daytime_string()
  ``''''''``{
  ``''''''``  using namespace std; // For time_t, time and ctime;
  ``''''''``  time_t now = time(0);
  ``''''''``  return ctime(&now);
  ``''''''``}

  ``''''''``class tcp_connection
  ``''''''``  : public boost::enable_shared_from_this<tcp_connection>
  ``''''''``{
  ``''''''``public:
  ``''''''``  typedef boost::shared_ptr<tcp_connection> pointer;

  ``''''''``  static pointer create(asio::io_service& io_service)
  ``''''''``  {
  ``''''''``    return pointer(new tcp_connection(io_service));
  ``''''''``  }

  ``''''''``  tcp::socket& socket()
  ``''''''``  {
  ``''''''``    return socket_;
  ``''''''``  }

  ``''''''``  void start()
  ``''''''``  {
  ``''''''``    message_ = make_daytime_string();

  ``''''''``    asio::async_write(socket_, asio::buffer(message_),
  ``''''''``        boost::bind(&tcp_connection::handle_write, shared_from_this(),
  ``''''''``          asio::placeholders::error,
  ``''''''``          asio::placeholders::bytes_transferred));
  ``''''''``  }

  ``''''''``private:
  ``''''''``  tcp_connection(asio::io_service& io_service)
  ``''''''``    : socket_(io_service)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  void handle_write(const asio::error_code& /*error*/,
  ``''''''``      size_t /*bytes_transferred*/)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  tcp::socket socket_;
  ``''''''``  std::string message_;
  ``''''''``};

  ``''''''``class tcp_server
  ``''''''``{
  ``''''''``public:
  ``''''''``  tcp_server(asio::io_service& io_service)
  ``''''''``    : acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))
  ``''''''``  {
  ``''''''``    start_accept();
  ``''''''``  }

  ``''''''``private:
  ``''''''``  void start_accept()
  ``''''''``  {
  ``''''''``    tcp_connection::pointer new_connection =
  ``''''''``      tcp_connection::create(acceptor_.get_io_service());

  ``''''''``    acceptor_.async_accept(new_connection->socket(),
  ``''''''``        boost::bind(&tcp_server::handle_accept, this, new_connection,
  ``''''''``          asio::placeholders::error));
  ``''''''``  }

  ``''''''``  void handle_accept(tcp_connection::pointer new_connection,
  ``''''''``      const asio::error_code& error)
  ``''''''``  {
  ``''''''``    if (!error)
  ``''''''``    {
  ``''''''``      new_connection->start();
  ``''''''``    }

  ``''''''``    start_accept();
  ``''''''``  }

  ``''''''``  tcp::acceptor acceptor_;
  ``''''''``};

  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    asio::io_service io_service;
  ``''''''``    tcp_server server(io_service);
  ``''''''``    io_service.run();
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tutdaytime3 Daytime.3 - An asynchronous TCP daytime server]

[endsect]

[endsect]

[section:tutdaytime4 Daytime.4 - A synchronous UDP daytime client]

This tutorial program shows how to use asio to implement a client application with UDP.


  ``''''''``#include <iostream>
  ``''''''``#include <boost/array.hpp>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::udp;



The start of the application is essentially the same as for the TCP daytime client.



  ``''''''``int main(int argc, char* argv[])
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    if (argc != 2)
  ``''''''``    {
  ``''''''``      std::cerr << "Usage: client <host>" << std::endl;
  ``''''''``      return 1;
  ``''''''``    }

  ``''''''``    asio::io_service io_service;



We use an [link asio.reference.ip__udp.resolver ip::udp::resolver] object to find the correct remote endpoint to use based on the host and service names. The query is restricted to return only IPv4 endpoints by the [link asio.reference.ip__udp.v4 ip::udp::v4()] argument.



  ``''''''``    udp::resolver resolver(io_service);
  ``''''''``    udp::resolver::query query(udp::v4(), argv[1], "daytime");



The [link asio.reference.ip__basic_resolver.resolve ip::udp::resolver::resolve()] function is guaranteed to return at least one endpoint in the list if it does not fail. This means it is safe to dereference the return value directly.


  ``''''''``    udp::endpoint receiver_endpoint = *resolver.resolve(query);



Since UDP is datagram-oriented, we will not be using a stream socket. Create an [link asio.reference.ip__udp.socket ip::udp::socket] and initiate contact with the remote endpoint.



  ``''''''``    udp::socket socket(io_service);
  ``''''''``    socket.open(udp::v4());

  ``''''''``    boost::array<char, 1> send_buf  = {{ 0 }};
  ``''''''``    socket.send_to(asio::buffer(send_buf), receiver_endpoint);



Now we need to be ready to accept whatever the server sends back to us. The endpoint on our side that receives the server's response will be initialised by [link asio.reference.basic_datagram_socket.receive_from ip::udp::socket::receive_from()].



  ``''''''``    boost::array<char, 128> recv_buf;
  ``''''''``    udp::endpoint sender_endpoint;
  ``''''''``    size_t len = socket.receive_from(
  ``''''''``        asio::buffer(recv_buf), sender_endpoint);

  ``''''''``    std::cout.write(recv_buf.data(), len);
  ``''''''``  }



Finally, handle any exceptions that may have been thrown.


  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}

See the [link asio.tutorial.tutdaytime4.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tutdaytime3 Daytime.3 - An asynchronous TCP daytime server]

Next: [link asio.tutorial.tutdaytime5 Daytime.5 - A synchronous UDP daytime server]



[section:src Source listing for Daytime.4]


  ``''''''``//
  ``''''''``// client.cpp
  ``''''''``// ~~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <boost/array.hpp>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::udp;

  ``''''''``int main(int argc, char* argv[])
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    if (argc != 2)
  ``''''''``    {
  ``''''''``      std::cerr << "Usage: client <host>" << std::endl;
  ``''''''``      return 1;
  ``''''''``    }

  ``''''''``    asio::io_service io_service;

  ``''''''``    udp::resolver resolver(io_service);
  ``''''''``    udp::resolver::query query(udp::v4(), argv[1], "daytime");
  ``''''''``    udp::endpoint receiver_endpoint = *resolver.resolve(query);

  ``''''''``    udp::socket socket(io_service);
  ``''''''``    socket.open(udp::v4());

  ``''''''``    boost::array<char, 1> send_buf  = {{ 0 }};
  ``''''''``    socket.send_to(asio::buffer(send_buf), receiver_endpoint);

  ``''''''``    boost::array<char, 128> recv_buf;
  ``''''''``    udp::endpoint sender_endpoint;
  ``''''''``    size_t len = socket.receive_from(
  ``''''''``        asio::buffer(recv_buf), sender_endpoint);

  ``''''''``    std::cout.write(recv_buf.data(), len);
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tutdaytime4 Daytime.4 - A synchronous UDP daytime client]

[endsect]

[endsect]

[section:tutdaytime5 Daytime.5 - A synchronous UDP daytime server]

This tutorial program shows how to use asio to implement a server application with UDP.


  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    asio::io_service io_service;



Create an [link asio.reference.ip__udp.socket ip::udp::socket] object to receive requests on UDP port 13.



  ``''''''``    udp::socket socket(io_service, udp::endpoint(udp::v4(), 13));



Wait for a client to initiate contact with us. The remote\_endpoint object will be populated by [link asio.reference.basic_datagram_socket.receive_from ip::udp::socket::receive_from()].



  ``''''''``    for (;;)
  ``''''''``    {
  ``''''''``      boost::array<char, 1> recv_buf;
  ``''''''``      udp::endpoint remote_endpoint;
  ``''''''``      asio::error_code error;
  ``''''''``      socket.receive_from(asio::buffer(recv_buf),
  ``''''''``          remote_endpoint, 0, error);

  ``''''''``      if (error && error != asio::error::message_size)
  ``''''''``        throw asio::system_error(error);



Determine what we are going to send back to the client.



  ``''''''``      std::string message = make_daytime_string();



Send the response to the remote\_endpoint.



  ``''''''``      asio::error_code ignored_error;
  ``''''''``      socket.send_to(asio::buffer(message),
  ``''''''``          remote_endpoint, 0, ignored_error);
  ``''''''``    }
  ``''''''``  }



Finally, handle any exceptions.


  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}



See the [link asio.tutorial.tutdaytime5.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tutdaytime4 Daytime.4 - A synchronous UDP daytime client]

Next: [link asio.tutorial.tutdaytime6 Daytime.6 - An asynchronous UDP daytime server]



[section:src Source listing for Daytime.5]


  ``''''''``//
  ``''''''``// server.cpp
  ``''''''``// ~~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <ctime>
  ``''''''``#include <iostream>
  ``''''''``#include <string>
  ``''''''``#include <boost/array.hpp>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::udp;

  ``''''''``std::string make_daytime_string()
  ``''''''``{
  ``''''''``  using namespace std; // For time_t, time and ctime;
  ``''''''``  time_t now = time(0);
  ``''''''``  return ctime(&now);
  ``''''''``}

  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    asio::io_service io_service;

  ``''''''``    udp::socket socket(io_service, udp::endpoint(udp::v4(), 13));

  ``''''''``    for (;;)
  ``''''''``    {
  ``''''''``      boost::array<char, 1> recv_buf;
  ``''''''``      udp::endpoint remote_endpoint;
  ``''''''``      asio::error_code error;
  ``''''''``      socket.receive_from(asio::buffer(recv_buf),
  ``''''''``          remote_endpoint, 0, error);

  ``''''''``      if (error && error != asio::error::message_size)
  ``''''''``        throw asio::system_error(error);

  ``''''''``      std::string message = make_daytime_string();

  ``''''''``      asio::error_code ignored_error;
  ``''''''``      socket.send_to(asio::buffer(message),
  ``''''''``          remote_endpoint, 0, ignored_error);
  ``''''''``    }
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tutdaytime5 Daytime.5 - A synchronous UDP daytime server]

[endsect]

[endsect]

[section:tutdaytime6 Daytime.6 - An asynchronous UDP daytime server]

[heading The main() function]


  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {



Create a server object to accept incoming client requests, and run the 
[link asio.reference.io_service io_service] object.


  ``''''''``    asio::io_service io_service;
  ``''''''``    udp_server server(io_service);
  ``''''''``    io_service.run();
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}



[heading The udp_server class]


  ``''''''``class udp_server
  ``''''''``{
  ``''''''``public:



The constructor initialises a socket to listen on UDP port 13.


  ``''''''``  udp_server(asio::io_service& io_service)
  ``''''''``    : socket_(io_service, udp::endpoint(udp::v4(), 13))
  ``''''''``  {
  ``''''''``    start_receive();
  ``''''''``  }

  ``''''''``private:
  ``''''''``  void start_receive()
  ``''''''``  {



The function [link asio.reference.basic_datagram_socket.async_receive_from ip::udp::socket::async_receive_from()] will cause the application to listen in the background for a new request. When such a request is received, the 
[link asio.reference.io_service io_service] object will invoke the `handle_receive()` function with two arguments: a value of type 
[link asio.reference.error_code error_code] indicating whether the operation succeeded or failed, and a `size_t` value `bytes_transferred` specifying the number of bytes received.


  ``''''''``    socket_.async_receive_from(
  ``''''''``        asio::buffer(recv_buffer_), remote_endpoint_,
  ``''''''``        boost::bind(&udp_server::handle_receive, this,
  ``''''''``          asio::placeholders::error,
  ``''''''``          asio::placeholders::bytes_transferred));
  ``''''''``  }



The function `handle_receive()` will service the client request.



  ``''''''``  void handle_receive(const asio::error_code& error,
  ``''''''``      std::size_t /*bytes_transferred*/)
  ``''''''``  {



The `error` parameter contains the result of the asynchronous operation. Since we only provide the 1-byte `recv_buffer_` to contain the client's request, the 
[link asio.reference.io_service io_service] object would return an error if the client sent anything larger. We can ignore such an error if it comes up.


  ``''''''``    if (!error || error == asio::error::message_size)
  ``''''''``    {



Determine what we are going to send.


  ``''''''``      boost::shared_ptr<std::string> message(
  ``''''''``          new std::string(make_daytime_string()));



We now call [link asio.reference.basic_datagram_socket.async_send_to ip::udp::socket::async_send_to()] to serve the data to the client.



  ``''''''``      socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
  ``''''''``          boost::bind(&udp_server::handle_send, this, message,
  ``''''''``            asio::placeholders::error,
  ``''''''``            asio::placeholders::bytes_transferred));



When initiating the asynchronous operation, and if using [link asio.tutorial.boost_bind boost::bind] , you must specify only the arguments that match the handler's parameter list. In this program, both of the argument placeholders (asio::placeholders::error and asio::placeholders::bytes\_transferred) could potentially have been removed.

Start listening for the next client request.



  ``''''''``      start_receive();



Any further actions for this client request are now the responsibility of `handle_send()`.


  ``''''''``    }
  ``''''''``  }



The function `handle_send()` is invoked after the service request has been completed.



  ``''''''``  void handle_send(boost::shared_ptr<std::string> /*message*/,
  ``''''''``      const asio::error_code& /*error*/,
  ``''''''``      std::size_t /*bytes_transferred*/)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  udp::socket socket_;
  ``''''''``  udp::endpoint remote_endpoint_;
  ``''''''``  boost::array<char, 1> recv_buffer_;
  ``''''''``};



See the [link asio.tutorial.tutdaytime6.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tutdaytime5 Daytime.5 - A synchronous UDP daytime server]

Next: [link asio.tutorial.tutdaytime7 Daytime.7 - A combined TCP/UDP asynchronous server]



[section:src Source listing for Daytime.6]


  ``''''''``//
  ``''''''``// server.cpp
  ``''''''``// ~~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <ctime>
  ``''''''``#include <iostream>
  ``''''''``#include <string>
  ``''''''``#include <boost/array.hpp>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/shared_ptr.hpp>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::udp;

  ``''''''``std::string make_daytime_string()
  ``''''''``{
  ``''''''``  using namespace std; // For time_t, time and ctime;
  ``''''''``  time_t now = time(0);
  ``''''''``  return ctime(&now);
  ``''''''``}

  ``''''''``class udp_server
  ``''''''``{
  ``''''''``public:
  ``''''''``  udp_server(asio::io_service& io_service)
  ``''''''``    : socket_(io_service, udp::endpoint(udp::v4(), 13))
  ``''''''``  {
  ``''''''``    start_receive();
  ``''''''``  }

  ``''''''``private:
  ``''''''``  void start_receive()
  ``''''''``  {
  ``''''''``    socket_.async_receive_from(
  ``''''''``        asio::buffer(recv_buffer_), remote_endpoint_,
  ``''''''``        boost::bind(&udp_server::handle_receive, this,
  ``''''''``          asio::placeholders::error,
  ``''''''``          asio::placeholders::bytes_transferred));
  ``''''''``  }

  ``''''''``  void handle_receive(const asio::error_code& error,
  ``''''''``      std::size_t /*bytes_transferred*/)
  ``''''''``  {
  ``''''''``    if (!error || error == asio::error::message_size)
  ``''''''``    {
  ``''''''``      boost::shared_ptr<std::string> message(
  ``''''''``          new std::string(make_daytime_string()));

  ``''''''``      socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
  ``''''''``          boost::bind(&udp_server::handle_send, this, message,
  ``''''''``            asio::placeholders::error,
  ``''''''``            asio::placeholders::bytes_transferred));

  ``''''''``      start_receive();
  ``''''''``    }
  ``''''''``  }

  ``''''''``  void handle_send(boost::shared_ptr<std::string> /*message*/,
  ``''''''``      const asio::error_code& /*error*/,
  ``''''''``      std::size_t /*bytes_transferred*/)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  udp::socket socket_;
  ``''''''``  udp::endpoint remote_endpoint_;
  ``''''''``  boost::array<char, 1> recv_buffer_;
  ``''''''``};

  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    asio::io_service io_service;
  ``''''''``    udp_server server(io_service);
  ``''''''``    io_service.run();
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tutdaytime6 Daytime.6 - An asynchronous UDP daytime server]

[endsect]

[endsect]

[section:tutdaytime7 Daytime.7 - A combined TCP/UDP asynchronous server]

This tutorial program shows how to combine the two asynchronous servers that we have just written, into a single server application.

[heading The main() function]


  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    asio::io_service io_service;



We will begin by creating a server object to accept a TCP client connection.


  ``''''''``    tcp_server server1(io_service);



We also need a server object to accept a UDP client request.


  ``''''''``    udp_server server2(io_service);



We have created two lots of work for the 
[link asio.reference.io_service io_service] object to do.


  ``''''''``    io_service.run();
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}



[heading The tcp_connection and tcp_server classes]

The following two classes are taken from [link asio.tutorial.tutdaytime3 Daytime.3] .


  ``''''''``class tcp_connection
  ``''''''``  : public boost::enable_shared_from_this<tcp_connection>
  ``''''''``{
  ``''''''``public:
  ``''''''``  typedef boost::shared_ptr<tcp_connection> pointer;

  ``''''''``  static pointer create(asio::io_service& io_service)
  ``''''''``  {
  ``''''''``    return pointer(new tcp_connection(io_service));
  ``''''''``  }

  ``''''''``  tcp::socket& socket()
  ``''''''``  {
  ``''''''``    return socket_;
  ``''''''``  }

  ``''''''``  void start()
  ``''''''``  {
  ``''''''``    message_ = make_daytime_string();

  ``''''''``    asio::async_write(socket_, asio::buffer(message_),
  ``''''''``        boost::bind(&tcp_connection::handle_write, shared_from_this()));
  ``''''''``  }

  ``''''''``private:
  ``''''''``  tcp_connection(asio::io_service& io_service)
  ``''''''``    : socket_(io_service)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  void handle_write()
  ``''''''``  {
  ``''''''``  }

  ``''''''``  tcp::socket socket_;
  ``''''''``  std::string message_;
  ``''''''``};

  ``''''''``class tcp_server
  ``''''''``{
  ``''''''``public:
  ``''''''``  tcp_server(asio::io_service& io_service)
  ``''''''``    : acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))
  ``''''''``  {
  ``''''''``    start_accept();
  ``''''''``  }

  ``''''''``private:
  ``''''''``  void start_accept()
  ``''''''``  {
  ``''''''``    tcp_connection::pointer new_connection =
  ``''''''``      tcp_connection::create(acceptor_.get_io_service());

  ``''''''``    acceptor_.async_accept(new_connection->socket(),
  ``''''''``        boost::bind(&tcp_server::handle_accept, this, new_connection,
  ``''''''``          asio::placeholders::error));
  ``''''''``  }

  ``''''''``  void handle_accept(tcp_connection::pointer new_connection,
  ``''''''``      const asio::error_code& error)
  ``''''''``  {
  ``''''''``    if (!error)
  ``''''''``    {
  ``''''''``      new_connection->start();
  ``''''''``    }

  ``''''''``    start_accept();
  ``''''''``  }

  ``''''''``  tcp::acceptor acceptor_;
  ``''''''``};



[heading The udp_server class]

Similarly, this next class is taken from the [link asio.tutorial.tutdaytime6 previous tutorial step] .


  ``''''''``class udp_server
  ``''''''``{
  ``''''''``public:
  ``''''''``  udp_server(asio::io_service& io_service)
  ``''''''``    : socket_(io_service, udp::endpoint(udp::v4(), 13))
  ``''''''``  {
  ``''''''``    start_receive();
  ``''''''``  }

  ``''''''``private:
  ``''''''``  void start_receive()
  ``''''''``  {
  ``''''''``    socket_.async_receive_from(
  ``''''''``        asio::buffer(recv_buffer_), remote_endpoint_,
  ``''''''``        boost::bind(&udp_server::handle_receive, this,
  ``''''''``          asio::placeholders::error));
  ``''''''``  }

  ``''''''``  void handle_receive(const asio::error_code& error)
  ``''''''``  {
  ``''''''``    if (!error || error == asio::error::message_size)
  ``''''''``    {
  ``''''''``      boost::shared_ptr<std::string> message(
  ``''''''``          new std::string(make_daytime_string()));

  ``''''''``      socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
  ``''''''``          boost::bind(&udp_server::handle_send, this, message));

  ``''''''``      start_receive();
  ``''''''``    }
  ``''''''``  }

  ``''''''``  void handle_send(boost::shared_ptr<std::string> /*message*/)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  udp::socket socket_;
  ``''''''``  udp::endpoint remote_endpoint_;
  ``''''''``  boost::array<char, 1> recv_buffer_;
  ``''''''``};



See the [link asio.tutorial.tutdaytime7.src full source listing]

Return to the [link asio.tutorial tutorial index]

Previous: [link asio.tutorial.tutdaytime6 Daytime.6 - An asynchronous UDP daytime server]



[section:src Source listing for Daytime.7]


  ``''''''``//
  ``''''''``// server.cpp
  ``''''''``// ~~~~~~~~~~
  ``''''''``//
  ``''''''``// Copyright (c) 2003-2014 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 <ctime>
  ``''''''``#include <iostream>
  ``''''''``#include <string>
  ``''''''``#include <boost/array.hpp>
  ``''''''``#include <boost/bind.hpp>
  ``''''''``#include <boost/shared_ptr.hpp>
  ``''''''``#include <boost/enable_shared_from_this.hpp>
  ``''''''``#include <asio.hpp>

  ``''''''``using asio::ip::tcp;
  ``''''''``using asio::ip::udp;

  ``''''''``std::string make_daytime_string()
  ``''''''``{
  ``''''''``  using namespace std; // For time_t, time and ctime;
  ``''''''``  time_t now = time(0);
  ``''''''``  return ctime(&now);
  ``''''''``}

  ``''''''``class tcp_connection
  ``''''''``  : public boost::enable_shared_from_this<tcp_connection>
  ``''''''``{
  ``''''''``public:
  ``''''''``  typedef boost::shared_ptr<tcp_connection> pointer;

  ``''''''``  static pointer create(asio::io_service& io_service)
  ``''''''``  {
  ``''''''``    return pointer(new tcp_connection(io_service));
  ``''''''``  }

  ``''''''``  tcp::socket& socket()
  ``''''''``  {
  ``''''''``    return socket_;
  ``''''''``  }

  ``''''''``  void start()
  ``''''''``  {
  ``''''''``    message_ = make_daytime_string();

  ``''''''``    asio::async_write(socket_, asio::buffer(message_),
  ``''''''``        boost::bind(&tcp_connection::handle_write, shared_from_this()));
  ``''''''``  }

  ``''''''``private:
  ``''''''``  tcp_connection(asio::io_service& io_service)
  ``''''''``    : socket_(io_service)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  void handle_write()
  ``''''''``  {
  ``''''''``  }

  ``''''''``  tcp::socket socket_;
  ``''''''``  std::string message_;
  ``''''''``};

  ``''''''``class tcp_server
  ``''''''``{
  ``''''''``public:
  ``''''''``  tcp_server(asio::io_service& io_service)
  ``''''''``    : acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))
  ``''''''``  {
  ``''''''``    start_accept();
  ``''''''``  }

  ``''''''``private:
  ``''''''``  void start_accept()
  ``''''''``  {
  ``''''''``    tcp_connection::pointer new_connection =
  ``''''''``      tcp_connection::create(acceptor_.get_io_service());

  ``''''''``    acceptor_.async_accept(new_connection->socket(),
  ``''''''``        boost::bind(&tcp_server::handle_accept, this, new_connection,
  ``''''''``          asio::placeholders::error));
  ``''''''``  }

  ``''''''``  void handle_accept(tcp_connection::pointer new_connection,
  ``''''''``      const asio::error_code& error)
  ``''''''``  {
  ``''''''``    if (!error)
  ``''''''``    {
  ``''''''``      new_connection->start();
  ``''''''``    }

  ``''''''``    start_accept();
  ``''''''``  }

  ``''''''``  tcp::acceptor acceptor_;
  ``''''''``};

  ``''''''``class udp_server
  ``''''''``{
  ``''''''``public:
  ``''''''``  udp_server(asio::io_service& io_service)
  ``''''''``    : socket_(io_service, udp::endpoint(udp::v4(), 13))
  ``''''''``  {
  ``''''''``    start_receive();
  ``''''''``  }

  ``''''''``private:
  ``''''''``  void start_receive()
  ``''''''``  {
  ``''''''``    socket_.async_receive_from(
  ``''''''``        asio::buffer(recv_buffer_), remote_endpoint_,
  ``''''''``        boost::bind(&udp_server::handle_receive, this,
  ``''''''``          asio::placeholders::error));
  ``''''''``  }

  ``''''''``  void handle_receive(const asio::error_code& error)
  ``''''''``  {
  ``''''''``    if (!error || error == asio::error::message_size)
  ``''''''``    {
  ``''''''``      boost::shared_ptr<std::string> message(
  ``''''''``          new std::string(make_daytime_string()));

  ``''''''``      socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
  ``''''''``          boost::bind(&udp_server::handle_send, this, message));

  ``''''''``      start_receive();
  ``''''''``    }
  ``''''''``  }

  ``''''''``  void handle_send(boost::shared_ptr<std::string> /*message*/)
  ``''''''``  {
  ``''''''``  }

  ``''''''``  udp::socket socket_;
  ``''''''``  udp::endpoint remote_endpoint_;
  ``''''''``  boost::array<char, 1> recv_buffer_;
  ``''''''``};

  ``''''''``int main()
  ``''''''``{
  ``''''''``  try
  ``''''''``  {
  ``''''''``    asio::io_service io_service;
  ``''''''``    tcp_server server1(io_service);
  ``''''''``    udp_server server2(io_service);
  ``''''''``    io_service.run();
  ``''''''``  }
  ``''''''``  catch (std::exception& e)
  ``''''''``  {
  ``''''''``    std::cerr << e.what() << std::endl;
  ``''''''``  }

  ``''''''``  return 0;
  ``''''''``}

Return to [link asio.tutorial.tutdaytime7 Daytime.7 - A combined TCP/UDP asynchronous server]

[endsect]

[endsect]

[section:boost_bind boost::bind]

See the [@http://www.boost.org/libs/bind/bind.html Boost: bind.hpp documentation] for more information on how to use `boost::bind`. 

[endsect]


[endsect]