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(); }