boost asio 网络编程案例简单改写

boost教程:http://zh.highscore.de/cpp/boost/
改写7.4网络编程案例,服务器支持连接多个客户端

服务端:
#include <iostream>
#include <string>
#include <boost/asio.hpp>

/// <summary>
/// 简单服务器,客户端连接就发送 HTTP/1.1 200 OK\r\nContent-Length: 13\r\n\r\nHello, world!
/// </summary>

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 <boost/asio.hpp>
#include <boost/array.hpp>
#include <iostream>
#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();
}

 

posted @ 2021-12-15 17:18  darkif  阅读(289)  评论(0编辑  收藏  举报