zoukankan      html  css  js  c++  java
  • 使用Boost asio实现异步的TCP/IP通信

      可以先了解一下Boost asio基本概念,以下是Boost asio实现的异步TCP/IP通信:

      服务器:

    #include "stdafx.h"
    #include <iostream>
    #include <boost/shared_ptr.hpp>
    #include <boost/asio.hpp>
    #include <boost/asio/placeholders.hpp>
    #include <boost/system/error_code.hpp>
    #include <boost/bind/bind.hpp>
    
    using namespace boost::asio;
    using namespace std;
    
    class server
    {
        typedef server this_type;
        typedef ip::tcp::acceptor acceptor_type;
        typedef ip::tcp::endpoint endpoint_type;
        typedef ip::tcp::socket socket_type;
        typedef ip::address address_type;
        typedef boost::shared_ptr<socket_type> sock_ptr;
    
    private:
        io_service m_io;
        acceptor_type m_acceptor;
    
    public:
        server() : m_acceptor(m_io, endpoint_type(ip::tcp::v4(), 6688))
        {    accept();    }
    
        void run(){ m_io.run();}
    
        void accept()
        {
            sock_ptr sock(new socket_type(m_io));
            m_acceptor.async_accept(*sock, boost::bind(&this_type::accept_handler, this, boost::asio::placeholders::error, sock));
        }
    
        void accept_handler(const boost::system::error_code& ec, sock_ptr sock)
        {
            if (ec)
            {    return;    }
    
            cout<<"Client:";
            cout<<sock->remote_endpoint().address()<<endl;
            sock->async_write_some(buffer("hello asio"), boost::bind(&this_type::write_handler, this, boost::asio::placeholders::error));
            // 发送完毕后继续监听,否则io_service将认为没有事件处理而结束运行
            accept();
        }
    
        void write_handler(const boost::system::error_code&ec)
        {
            cout<<"send msg complete"<<endl;
        }
    };
    
    int main()
    {
        try
        {
            cout<<"Server start."<<endl;
            server srv;
            srv.run();
        }
        catch (std::exception &e)
        {
            cout<<e.what()<<endl;
        }
    
        return 0;
    }

      客户端:

    #include "stdafx.h"
    #include <iostream>
    #include <boost/shared_ptr.hpp>
    #include <boost/asio.hpp>
    #include <boost/asio/placeholders.hpp>
    #include <boost/system/error_code.hpp>
    #include <boost/bind/bind.hpp>
    
    using namespace boost::asio;
    using namespace std;
    
    class client
    {
        typedef client this_type;
        typedef ip::tcp::acceptor acceptor_type;
        typedef ip::tcp::endpoint endpoint_type;
        typedef ip::tcp::socket socket_type;
        typedef ip::address address_type;
        typedef boost::shared_ptr<socket_type> sock_ptr;
        typedef vector<char> buffer_type;
    
    private:
        io_service m_io;
        buffer_type m_buf;
        endpoint_type m_ep;
    public:
        client(): m_buf(100, 0), m_ep(address_type::from_string("127.0.0.1"), 6688)
        {    start();    }
    
        void run()
        {    m_io.run();}
    
        void start()
        {
            sock_ptr sock(new socket_type(m_io));
            sock->async_connect(m_ep, boost::bind(&this_type::conn_handler, this, boost::asio::placeholders::error, sock));
        }
    
        void conn_handler(const boost::system::error_code&ec, sock_ptr sock)
        {
            if (ec)
            {return;}
            cout<<"Receive from "<<sock->remote_endpoint().address()<<": "<<endl;
            sock->async_read_some(buffer(m_buf), boost::bind(&client::read_handler, this, boost::asio::placeholders::error, sock));
        }
    
        void read_handler(const boost::system::error_code&ec, sock_ptr sock)
        {
            if (ec)
            {return;}
            sock->async_read_some(buffer(m_buf), boost::bind(&client::read_handler, this, boost::asio::placeholders::error, sock));
            cout<<&m_buf[0]<<endl;
        }
    };
    
    int main()
    {
        try
        {
            cout<<"Client start."<<endl;
            client cl;
            cl.run();
        }
        catch (std::exception &e)
        {
            cout<<e.what()<<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    安装固态硬盘,小米笔记本13.3
    glut相关函数说明
    qt 显示中文
    简述FPS的计算方法
    【BZOJ3527】【ZJOI2014】—力(FFT)
    【BZOJ3653】【洛谷P3899】—谈笑风生(子弹滞销+长链剖分)
    【COGS2652】—天文密葬法(分数规划+长链剖分)
    【BZOJ3611】【HeOI2014】—大工程(虚树+dp)
    【BZOJ1758】【WC2010】—重建计划(点分治+分数规划)
    【BZOJ4765】—普通计算姬(分块+BIT)
  • 原文地址:https://www.cnblogs.com/jiayayao/p/6262771.html
Copyright © 2011-2022 走看看