[Boost基础]并发编程——asio网络库——异步socket处理

异步服务器端

#include <conio.h>

#include <iostream>

using namespace std;

#include <boost/asio.hpp>

#include <boost/shared_ptr.hpp>

#include <boost/bind.hpp>

using namespace boost;

using namespace boost::asio;

void test1(){}

//异步server

//异步程序的处理流程与同步程序基本相同,只需要把原有的同步调用函数都换成前缀是async_的异步调用函数,并增加回调函数,在回调函数中再启动一个异步调用。

class server

{

private:

    io_service& ios;

    ip::tcp::acceptor acceptor;

    typedef shared_ptr<ip::tcp::socket> sock_pt;

public:

    server(io_service& io):ios(io),acceptor(ios,ip::tcp::endpoint(ip::tcp::v4(),6688))

    {

        start();

    }

    void start()

    {

        sock_pt sock(new ip::tcp::socket(ios));//智能指针

        acceptor.async_accept(*sock,bind(&server::accept_handler,this,placeholders::error,sock));//异步监听服务

        //start()函数用于启动异步接受连接,需要调用acceptor的async_accept()函数。为了能够让socket镀锡能够被异步调用后还能使用,我们必须使用shared_ptr来创建socket对象的智能指针,它可以再程序的整个生命周期中存在,直到没有人使用它为止。

    }

    //当有TCP连接发生时,server::accept_handler()函数将被调用,它使用socket对象发生数据。

    void accept_handler(const system::error_code& ec,sock_pt sock)

    {

        if (ec)//检测错误码

        {

            return;

        }

        cout<<"client:";//输出连接的客户端信息

        cout<<sock->remote_endpoint().address()<<" port:"<<sock->remote_endpoint().port()<<endl;

        sock->async_write_some(buffer("hello asio"),bind(&server::write_handler,this,placeholders::error));

        start();//再次启动异步接受连接

        //首先它必须检测asio传递的error_code,保证没有错误发生。然后调用socket对象的async_write_some()异步发生数据。同样,我们必须再为这个异步调用编写回调函数write_handler()。当发生完数据后不要忘了调用start()再次启动服务器接收连接,否则当完成数据发送后io_service将因为没有时间处理而结束运行。

    }

    void write_handler(const system::error_code&)

    {

        cout<<"send msg complete."<<endl;

    }

};

void test2()

{

    try

    {

        cout<<"server start."<<endl;

        io_service ios;

        server serv(ios);

        ios.run();

    } 

    catch (std::exception& e)

    {

        cout<<e.what()<<endl;

    }

} 

void test(char t)  

{  

    std::cout<<"press key====="<<t<<std::endl;  

    switch (t)  

    {    

    case '1':test1();break;   

    case '2':test2();break;     

    case 27:  

    case 'q':exit(0);break;  

    default: std::cout<<"default "<<t<<std::endl;break;  

    }  

}  

void main()

{

    while (1)

    {

        test(getch());

    }

}

异步客户端

#include <conio.h>

#include <iostream>

using namespace std;

#include <boost/asio.hpp>

#include <boost/bind.hpp>

#include <boost/shared_ptr.hpp>

using namespace boost;

using namespace boost::asio;

void test1(){}

void test2(){}

//异步client

class client

{

private:

    io_service& ios;

    ip::tcp::endpoint ep;

    typedef shared_ptr<ip::tcp::socket> sock_pt;

public:

    client(io_service& io):ios(io),ep(ip::address::from_string("127.0.0.1"),6688)

    {

        start();

    }

    void start()

    {

        sock_pt sock(new ip::tcp::socket(ios));//智能指针

        sock->async_connect(ep,bind(&client::conn_handler,this,placeholders::error,sock)); 

    } 

    void conn_handler(const system::error_code& ec,sock_pt sock)

    {

        if (ec)//检测错误码

        {

            return;

        }

        cout<<"recive from:";//输出连接的服务器端信息

        cout<<sock->remote_endpoint().address()<<" port:"<<sock->remote_endpoint().port()<<endl;

        shared_ptr<vector<char>>str(new vector<char>(100,0));//建立接收数据的缓冲区

        sock->async_read_some(buffer(*str),bind(&client::read_handler,this,placeholders::error,str));//异步读取数据

        start();// 再次启动异步连接

    }

    void read_handler(const system::error_code& ec,shared_ptr<vector<char>>str)

    {

        if (ec)

        {

            return;

        }

        cout<<&(*str)[0]<<endl;//输出接收的数据

    }

};

void test3()

{

    try

    {

        cout<<"client start."<<endl;

        io_service ios;

        client cl(ios);

        ios.run();

    }  

    catch (std::exception& e)

    {

        cout<<e.what()<<endl;

    }

}

void test(char t)  

{  

    std::cout<<"press key====="<<t<<std::endl;  

    switch (t)  

    {    

    case '1':test1();break;   

    case '2':test2();break;   

    case '3':test3();break;   

    case 27:  

    case 'q':exit(0);break;  

    default: std::cout<<"default "<<t<<std::endl;break;  

    }  

}  

void main()  

{  

    while(1)   

        test(getch());   

}  
结果: [Boost基础]并发编程——asio网络库——异步socket处理不停的执行

你可能感兴趣的:(socket)