boost asio学习笔记 [1] - 同步通讯

本文以一段示例代码,说明使用boost asio进行同步通讯的使用方法。

#include <iostream>
#include <boost/asio.hpp>
using namespace std;
using boost::asio::ip::tcp; 
int main()
{
    boost::asio::io_service   ioservice;    
        // I/O事件模型封装,如win下的iocp,unix下的poll, linux下的epoll等
    tcp::socket               socket(ioservice);  
    tcp::endpoint             endpoint;     // tcp端点,包含地址和端口
    boost::system::error_code errcode;
    tcp::resolver resolver(ioservice);      // 地址名称解析器
    tcp::resolver::iterator iter_endpoint;  
        // resolver一次可返回多个地址,使用迭代器逐个访问
    tcp::resolver::query query("mail.163.com", "pop3");  
        // 主机地址查询条件类,第一个参数是主机名,后一个是所需连接的服务名。
        // 指定服务名可以使返回的endpoint除了包含主机地址,还会设定该服务的默认端口(如pop3默认端口为110)
        // 如果只需要查询主机地址,则服务名可以为空字符串(返回的endpoint.port()==0)
    
    iter_endpoint = resolver.resolve(query, errcode);  // 解析所需的服务地址
    if ( errcode.value() != 0) {
        cout<<"error code: "<<errcode.value()<<", "<<"error message: "<<errcode.message()<<endl;
        return 1;
    }
    
    // 获取找到的目标服务端点地址和端口(存储在endpoint实例中)
    endpoint = iter_endpoint->endpoint(); 
    cout<<endpoint.address()<<":"<<endpoint.port()<<endl;
    
    // pop3命令
    const char *cmd_user = "user myuser\n";
    const char *cmd_pass = "pass mypass\n";
    const char *cmd_list = "list\n";
    const char *cmd_quit = "quit\n";
    char result[256];   // 服务器返回消息缓存
    
    try {
        // 连接POP3服务器,并获取服务器欢迎消息。
        // boost::asio::buffer函数将创建一个缓存包装对象,内部地址指向result变量
        socket.connect(endpoint);  
        size_t len = socket.read_some(boost::asio::buffer(result, 256));
        if ( len > 0 ) {
            result[len] = ‘\0‘;
            cout<<"received: "<<result<<endl;
        }
        
        // 发送用户命令, 并接收回复
        socket.send(boost::asio::buffer(cmd_user, strlen(cmd_user)));
        len = socket.read_some(boost::asio::buffer(result, 256));
        if ( len > 0 ) {
            result[len] = ‘\0‘;
            cout<<"received: "<<result<<endl;
        }

        // 发送口令命令, 并接收回复
        socket.send(boost::asio::buffer(cmd_pass, strlen(cmd_pass)));
        len = socket.read_some(boost::asio::buffer(result, 256));
        if ( len > 0 ) {
            result[len] = ‘\0‘;
            cout<<"received: "<<result<<endl;
        }

        // 发送退出命令, 并接收回复
        socket.send(boost::asio::buffer(cmd_quit, strlen(cmd_quit)));
        len = socket.read_some(boost::asio::buffer(result, 256));
        if ( len > 0 ) {
            result[len] = ‘\0‘;
            cout<<"received: "<<result<<endl;
        }
        socket.close();
    } catch (const boost::system::system_error& e) {
        cout<<"connect error: "<<e.what()<<endl;
    }
    return 0;
}
时间: 2024-10-10 13:53:57

boost asio学习笔记 [1] - 同步通讯的相关文章

Boost.Asio学习笔记一、linux下boost库的安装

学习开源库的第一步就是,编译安装,然后我们才能写一写demo去测试. 所以本章我们学一下在linux编译安装Boost库,为了方便起见,直接安装完整库. 我使用的版本是boost_1_55_0,版本差别不大. [[email protected] ~]$ tar -zxvf boost_1_55_0.tar.gz [[email protected] boost_1_55_0]$ ./bootstrap.sh --prefix=/home/mjf/lib [[email protected] b

Boost Thread学习笔记二

除了thread,boost::thread另一个重要组成部分是mutex,以及工作在mutex上的boost::mutex::scoped_lock.condition和barrier,这些都是为实现线程同步提供的. mutexboost提供的mutex有6种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive_try_mutexboost::recursive_timed_m

Boost Thread学习笔记三

下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost::mutex类似,但boost::mutex是基于CriticalSection<临界区>的):m_mutex,其中:m_queue相当于当前所有等待线程的等待队列,构造函数中调用CreateSemaphore来创建Semaphore时,lMaximumCount参数被指定为(std::nume

Boost Thread学习笔记四

barrierbarrier类的接口定义如下: 1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 public: 4   // construct/copy/destruct 5   barrier(size_t n); 6   ~barrier(); 7  8   // waiting 9   bool wait();10 }; barrier类为我们提供了这样一种控制线程同步的机制:前n - 1次调

Boost Thread学习笔记

thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 Windows线程API还是pthread,或者Macintosh Carbon平台的thread实现.以下只讨论Windows,即使用 BOOST_HAS_WINTHREADS的情况.thread类提供了两种构造函数:thread::thread()thread::thread(const func

Boost Thread学习笔记五

多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thread库为我们提供了一个接口简单的TLS的面向对象的封装,以下是tss类的接口定义: class tss{public:    tss(boost::function1<void, void*>* pcleanup);    void* get() const;    void set(void*

boost uuid 学习笔记

#include <vector>#include <iostream>#include <boost/uuid/uuid.hpp>#include <boost/uuid/uuid_generators.hpp>#include <boost/uuid/uuid_io.hpp>using namespace boost::uuids;using namespace std;int main(){ //----------------------

多线程编程学习笔记——线程同步(三)

接上文 多线程编程学习笔记——线程同步(一) 接上文 多线程编程学习笔记——线程同步(二) 七.使用Barrier类 Barrier类用于组织多个线程及时在某个时刻会面,其提供一个回调函数,每次线程调用了SignalAndWait方法后该回调函数就会被执行. 1.代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //

boost asio 学习(九) boost::asio 网络封装

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=10 9. A boost::asio network wrapper (TCP) 现在我们了解asio和TCP网络方面的知识,我们可以尝试下封装网络底层.通过使用这个封装,我们可以重用代码并且将精力集中于业务逻 辑方面而不在网络通讯方面花费太多精力. 重要提示:本代码仅仅用于教学目的.不要在商业系统中使用该代码,