Network programming
with Boost.Asio
What are the network I/O objects?
How are the network I/O objects used?
What are helper functions for async operations?
What are best practices?
Boris Schling, boris@highscore.de
Meeting C++, Dsseldorf, 10 November 2012
Network I/O objects
ip::tcp::acceptor
ip::udp::resolver
ip::tcp::iostream
ip::udp::socket
ip::tcp::resolver
ip::icmp::resolver
ip::tcp::socket
ip::icmp::socket
Network programming with Boost.Asio
Network I/O objects
ip::tcp::acceptor
ip::tcp::iostream
ip::tcp::resolver
ip::udp::resolver
ip::icmp::resolver
ip::tcp::socket
ip::udp::socket
ip::icmp::socket
Network programming with Boost.Asio
Acceptor
void handler(const boost::system::error_code &ec) {}
...
ip::tcp::endpoint endpoint(ip::tcp::v4(), 80);
ip::tcp::acceptor acceptor(io_service, endpoint);
acceptor.listen();
ip::tcp::socket sock(io_service);
acceptor.async_accept(sock, handler);
...
Use acceptors to accept incoming TCP/IP
connections
Network programming with Boost.Asio
Socket
void handler(const boost::system::error_code &ec,
std::size_t bytes_transferred) {}
...
ip::tcp::socket sock(io_service);
boost::array<char, 4096> buf;
sock.async_read_some(buffer(buf), handler);
async_read(sock, buffer(buf), handler);
...
Use sockets to receive data (consider using
free-standing helper functions)
Network programming with Boost.Asio
Socket
void handler(const boost::system::error_code &ec,
std::size_t bytes_transferred) {}
...
ip::tcp::socket sock(io_service);
std::string data = "Hello, world!";
sock.async_write_some(buffer(data), handler);
async_write(sock, buffer(data), handler);
...
Use sockets to send data (consider using
free-standing helper functions)
Network programming with Boost.Asio
Resolver
void handler(const boost::system::error_code &ec,
ip::tcp::resolver::iterator it)
{ sock.connect(*it); }
...
ip::tcp::resolver resolver(io_service);
ip::tcp::resolver::query query("www.highscore.de", "80");
resolver.async_resolve(query, handler);
...
Use resolvers to map hostnames and
services to IP addresses
Network programming with Boost.Asio
IOStream
ip::tcp::iostream s("www.highscore.de", "9999");
if (s)
{
s << "Hello, world!" << std::endl;
std::string data;
std::getline(s, data);
}
Use streams to send and receive data over
networks with the operators << and >>
Network programming with Boost.Asio
Best Practices
Always check the error code in handlers
Use free-standing helper functions for
connecting, sending and receiving
Use io_service::post() to execute code in an
event loops thread
Use boost::enable_shared_from_this for
dynamically allocated objects whose member
functions are used for callbacks
Network programming with Boost.Asio
More information
Boost.Asio documentation:
http://www.boost.org/libs/asio/
Boost.Asio examples:
http://www.boost.org/doc/libs/1_51_0/doc/html/boost_asio/examples.html
Online book:
http://en.highscore.de/cpp/boost/asio.html
http://www.highscore.de/cpp/boost/asio.html (German)
http://zh.highscore.de/cpp/boost/asio.html (Chinese)
JTC1/SC22/WG21 paper N3389:
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3389.pdf
Network programming with Boost.Asio
10