zoukankan      html  css  js  c++  java
  • 异步socket处理

    服务器端:

    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    class Server
    {
    private:
    	boost::asio::io_service &ios;
    	boost::asio::ip::tcp::acceptor acceptor;
    	typedef boost::shared_ptr<boost::asio::ip::tcp::socket> sock_pt;
    public:
    	Server(boost::asio::io_service &io) : ios(io),
    		acceptor(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 6688))
    	{
    		start();
    	}
    
    	void start()
    	{
    		sock_pt sock(new boost::asio::ip::tcp::socket(ios)); // 智能指针
    		acceptor.async_accept(*sock,
    			boost::bind(&Server::accept_handler, this, _1, sock)); // 异步监听服务
    	}
    
    	void accept_handler(const boost::system::error_code &e, sock_pt sock)
    	{
    		if (e) // 检测错误码
    		{
    			return;
    		}
    		std::cout << "client: ";
    		std::cout << sock->remote_endpoint().address() << std::endl;
    		sock->async_write_some(boost::asio::buffer("hello client..."),
    			boost::bind(&Server::write_hander, this, _1));
    		start(); // 再次启动异步监听
    	}
    
    	void write_hander(const boost::system::error_code &e)
    	{
    		std::cout << "send message complete." << std::endl;
    	}
    };
    int main()
    {
    	try
    	{
    		std::cout << "server start..." << std::endl;
    		boost::asio::io_service ios;
    		Server server(ios);
    		ios.run(); // 启动异步调用事件处理循环
    	}
    	catch (std::exception &e)
    	{
    		std::cout << e.what() << std::endl;
    	}
    	return 0;
    }
    

      

    客户端:

    #include <boost/thread.hpp>
    #include <boost/asio.hpp>
    #include <boost/date_time/posix_time/posix_time.hpp>
    #include <vector>
    
    class Client
    {
    private:
    	boost::asio::io_service &ios;
    	boost::asio::ip::tcp::endpoint ep;
    	typedef boost::shared_ptr<boost::asio::ip::tcp::socket> sock_pt;
    public:
    	Client(boost::asio::io_service &io) :ios(io),
    		ep(boost::asio::ip::address::from_string("127.0.0.1"), 6688)
    	{
    		start(); // 启动异步连接
    	}
    	void start()
    	{
    		sock_pt sock(new boost::asio::ip::tcp::socket(ios));
    		sock->async_connect(ep, boost::bind(&Client::conn_hander, this, _1, sock)); // 异步连接
    	}
    	void conn_hander(const boost::system::error_code &e, sock_pt sock)
    	{
    		if (e)
    		{
    			return;
    		}
    		std::cout << "recive from " << sock->remote_endpoint().address() << ": ";
    		boost::shared_ptr<std::vector<char> > str(new std::vector<char>(100, 0));
    		sock->async_read_some(boost::asio::buffer(*str),
    			boost::bind(&Client::read_hander, this, _1, str)); // 异步读取数据
    		start(); // 再次启动异步连接
    	}
    	void read_hander(const boost::system::error_code &e, boost::shared_ptr<std::vector<char> > str)
    	{
    		if (e)
    		{
    			return;
    		}
    		std::cout << &(*str)[0] << std::endl;
    	}
    };
    int main()
    {
    	try
    	{
    		std::cout << "client start..." << std::endl;
    		boost::asio::io_service ios;
    		Client client(ios);
    		ios.run();
    	}
    	catch (std::exception &e)
    	{
    		std::cout << e.what() << std::endl;
    	}
    		
    	return 0;
    }
    

      

  • 相关阅读:
    使用 Promise.all 同时发起多个请求
    vite 开发 Cesium 程序最佳配置实践
    【linux学习】使用grep命令获取过滤的数据作为下个命令的入参
    记一次k8s depolyment失败处理
    powerdesigner导出excel数据字典
    vue 时间格式
    ASP.NET MVC4 跨域配置
    Win10系统中切换虚拟桌面的快捷键如何设置
    不顾一切最简NHinbernate配置并读写数据库
    Windows time_wait过多解决办法
  • 原文地址:https://www.cnblogs.com/ACGame/p/9114500.html
Copyright © 2011-2022 走看看