boost教程:http://zh.highscore.de/cpp/boost/
改写7.4网络编程案例,服务器支持连接多个客户端
服务端:
#include
#include <string>
#include
///
/// 简单服务器,客户端连接就发送 HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, world!
///
boost::asio::io_context io;
boost::asio::ip::tcp::socket sock(io);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 9076);
boost::asio::ip::tcp::acceptor acceptor(io, endpoint);
std::string data = "HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, world!";
void accept_handler(const boost::system::error_code& ec)
{
if (!ec)
{
//如果有新客户端连接,需要将sock转移给新的客户端sock,原来的sock用于继续接收新客户端
boost::asio::ip::tcp::socket client_sock(std::move(sock));
client_sock.async_write_some(boost::asio::buffer(data), [](const boost::system::error_code& ec, std::size_t size) {});
}
acceptor.async_accept(sock, accept_handler);
}
int main()
{
acceptor.listen();
acceptor.async_accept(sock,accept_handler);
io.run();
}
客户端:
#include
#include
#include
#include <string>
boost::asio::io_context io;
boost::asio::ip::tcp::socket sock(io);
boost::asio::ip::tcp::resolver resolver(io);
boost::array<char, 1024> buff;
void read_handler(const boost::system::error_code& ec, std::size_t size)
{
//请留意,read_handler() 在将数据写出至 std::cout 之后,会再次调用 async_read_some() 方法。
//这是必需的,因为无法保证仅在一次异步操作中就可以接收到整个网页。 async_read_some() 和 read_handler()
//的交替调用只有当连接被破坏时才中止,如当 web 服务器已经传送完整个网页时。 这种情况下,在 read_handler() 内部将报告一个错误,
// 以防止进一步将数据输出至标准输出流,以及进一步对该 socket 调用 async_read() 方法。 这时该例程将停止,因为没有更多的异步操作了。
if (!ec)
{
std::cout << std::string(buff.data(), size) << std::endl;
//客户端接收一次消息接收完就结束进程
sock.async_read_some(boost::asio::buffer(buff), read_handler);
}
//客户端可以继续接收消息,不结束进程
//sock.async_read_some(boost::asio::buffer(buff), read_handler);
}
void connect_handler(const boost::system::error_code& ec)
{
if (!ec)
{
sock.async_read_some(boost::asio::buffer(buff), read_handler);
}
}
void resolver_handler(const boost::system::error_code& ec, boost::asio::ip::tcp::resolver::iterator it)
{
if (!ec)
{
sock.async_connect(*it, connect_handler);
}
}
int main()
{
boost::asio::ip::tcp::resolver::query query("127.0.0.1", "9076");
resolver.async_resolve(query, resolver_handler);
io.run();
}