Boost asio实现的异步TCP/IP通信

2018-05-02  本文已影响0人  hades2013

asio库基于操作系统提供的异步机制,采用前摄器模式(Proactor)实现可移植的异步(或同步)IO操作,不需要使用多线程和锁,有效避免多线程编程带来的诸多有害副作用(如竞争,死锁)。

asio封装了操作系统的select、kqueue、poll/epoll、overlapped I/O等机制,实现异步IO模型。在同步模式下,程序发起一个IO操作,向io_service提交请求,io_service把操作转交给操作系统,同步地等待。当IO操作完成时,操作系统通知io_service,然后io_service再把结果发回给程序,完成整个同步流程。在异步模式下,程序除了要发起IO操作,还要定义一个用于回调的完成处理函数。io_service同样把IO操作转交给操作系统执行,但它不同步等待,而是立即返回。调用io_service的run()成员函数可以等待异步操作完成,当异步操作完成时io_service从操作系统获取结果,在调用handler执行后续逻辑。

Boost asio实现的异步TCP/IP通信:

#include <iostream>
#include <boost/asio.hpp>

using namespace boost::asio;

int main(int argc, char const *argv[])
{
    io_service iosev; 
    ip::tcp::acceptor acceptor(iosev, ip::tcp::endpoint(ip::tcp::v4(), 1000));
    for(;;){
        ip::tcp::socket socket(iosev);
        acceptor.accept(socket);
        std::cout<<socket.remote_endpoint().address()<<std::endl; 
        boost::system::error_code ec; 
        socket.write_some(buffer("hello world1"), ec);

        if(ec){
            std::cout<<boost::system::system_error(ec).what()<<std::endl; 
            break; 
        }
    }
    return 0;
}

服务端文件asioServer.cpp 编译

g++  -o asioServer asioServer.cpp -lboost_system
#include <iostream>
#include <boost/asio.hpp>

using namespace boost::asio; 

int main(int argc, char const *argv[])
{
    io_service iosev; 
    ip::tcp::socket socket(iosev);
    ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);

    boost::system::error_code ec; 
    socket.connect(ep, ec);
    if(ec){
        std::cout<<boost::system::system_error(ec).what()<<std::endl; 
        return -1; 
    }

    char buf[100];
    size_t len = socket.read_some(buffer(buf), ec);
    std::cout.write(buf, len);

    return 0;
}

客户端编译asioClient.cpp :

g++ -o asioClient asioClient.cpp -lboost_system
上一篇下一篇

猜你喜欢

热点阅读