Boost::Asio
同步TCP客户端
boost::asio::buffer()
函数可以使用std::array
,会自动计算大小,也可以使用char []
或者 std::vector
。当服务器关闭连接, ip::tcp::socket::read_some()
函数会退出boost::asio::error::eof error
。
#include <array>
#include <iostream>
#include <boost/asio.hpp>using boost::asio::ip::tcp;int main(int argc, char* argv[])
{try{if (argc != 2){std::cerr << "Usage: client <host>" << std::endl;return 1;}boost::asio::io_context io_context;tcp::resolver resolver(io_context);tcp::resolver::results_type endpoints =resolver.resolve(argv[1], "daytime");tcp::socket socket(io_context);boost::asio::connect(socket, endpoints);for (;;){std::array<char, 128> buf;boost::system::error_code error;size_t len = socket.read_some(boost::asio::buffer(buf), error);if (error == boost::asio::error::eof)break; else if (error)throw boost::system::system_error(error); std::cout.write(buf.data(), len);}}catch (std::exception& e){std::cerr << e.what() << std::endl;}return 0;
}
同步TCP服务器
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>using boost::asio::ip::tcp;std::string make_daytime_string()
{using namespace std; time_t now = time(0);return ctime(&now);
}int main()
{try{boost::asio::io_context io_context;tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13));for (;;){tcp::socket socket(io_context);acceptor.accept(socket);std::string message = make_daytime_string();boost::system::error_code ignored_error;boost::asio::write(socket, boost::asio::buffer(message), ignored_error);}}catch (std::exception& e){std::cerr << e.what() << std::endl;}return 0;
}
异步TCP服务器
#include <ctime>
#include <functional>
#include <iostream>
#include <memory>
#include <string>
#include <boost/asio.hpp>using boost::asio::ip::tcp;std::string make_daytime_string()
{using namespace std; time_t now = time(0);return ctime(&now);
}class tcp_connection: public std::enable_shared_from_this<tcp_connection>
{
public:typedef std::shared_ptr<tcp_connection> pointer;static pointer create(boost::asio::io_context& io_context){return pointer(new tcp_connection(io_context));}tcp::socket& socket(){return socket_;}void start(){message_ = make_daytime_string();boost::asio::async_write(socket_, boost::asio::buffer(message_),std::bind(&tcp_connection::handle_write, shared_from_this(),boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));}private:tcp_connection(boost::asio::io_context& io_context): socket_(io_context){}void handle_write(const boost::system::error_code& ,size_t ){}tcp::socket socket_;std::string message_;
};class tcp_server
{
public:tcp_server(boost::asio::io_context& io_context): io_context_(io_context),acceptor_(io_context, tcp::endpoint(tcp::v4(), 13)) {start_accept();}private:void start_accept() {tcp_connection::pointer new_connection =tcp_connection::create(io_context_);acceptor_.async_accept(new_connection->socket(),std::bind(&tcp_server::handle_accept, this, new_connection,boost::asio::placeholders::error));}void handle_accept(tcp_connection::pointer new_connection,const boost::system::error_code& error){if (!error){new_connection->start();}start_accept();}boost::asio::io_context& io_context_;tcp::acceptor acceptor_;
};int main()
{try{boost::asio::io_context io_context;tcp_server server(io_context);io_context.run();}catch (std::exception& e){std::cerr << e.what() << std::endl;}return 0;
}