• boost 编译 asio 程序,简单socket 编程


    自己第一次玩boost,对C++也非常不熟悉,记录一下自己的学习过程。

    安装编译

    boost 包解压到/opt下

    tar -zxvf /media/C06EDE596EDE47B4/mnt/boost_1_55_0.tar.gz  -C /opt

    首先执行生成b2的脚本

    /opt/boost_1_55_0/bootstrap.sh

    编译boost 与安装

    /opt/boost_1_55_0/b2 && /opt/boost_1_55_0/b2 install

    安装完成后,会在/usr/local/lib保存.so 与.a 文件,头文件则存放在/usr/local/include/boost/路径下

    参考文章:http://www.cnblogs.com/hcfalan/archive/2011/02/23/1962657.html

    这篇博文不会讲解代码和原理,只是简单记录学习步骤。

    #include <iostream> 
    #include <boost/asio.hpp> 
    
    using namespace boost::asio;
    #define BLOCK_SIZE 64*1024
    
    int main(int argc, char* argv[])
    {
        // 所有asio类都需要io_service对象 
        io_service iosev; 
        ip::tcp::acceptor acceptor(iosev,  
            ip::tcp::endpoint(ip::tcp::v4(), 1000)); 
        for(;;) 
        { 
            // socket对象 
            ip::tcp::socket socket(iosev); 
            // 等待直到客户端连接进来 
            acceptor.accept(socket); 
            // 显示连接进来的客户端 
            std::cout << "client from: " 
                << socket.remote_endpoint().address() << std::endl; 
            
            boost::system::error_code ec;
    
            // 从客户端读取数据
            char buf[BLOCK_SIZE];
            int len = socket.read_some(buffer(buf), ec);
            // 或者可以使用read_until读到某个字符为止
            // 或者可以使用某种判断方式循环读取
    
            if (ec)
            {
                std::cout <<  
                    boost::system::system_error(ec).what() << std::endl; 
                break; 
            }
            std::cout.write(buf, len);
            std::cout << len << std::endl;
    
            //Sleep(1000);
    
            // 向客户端发送 
            len = socket.write_some(buffer(buf, len), ec); 
            if(ec) 
            { 
                std::cout <<  
                    boost::system::system_error(ec).what() << std::endl; 
                break; 
            } 
            std::cout << "writed " << len << std::endl;
            // 与当前客户交互完成后循环继续等待下一客户连接 
        } 
    
    
        return 0; 
    
    }

    代码几乎直接贴参考文章的。

    编译命令:

    g++ testSocketServer.cpp -lboost_system -I/usr/local/include/boost -L/usr/local/lib -o test

    我发现网上找的boost socket 编程里,都是指贴代码,没有将编译的命令也给出来,对于小白或者第一次接触的,编译都是一道坎。

    -I/usr/local/include/boost   

    是boost 的头文件路径

    -L/usr/local/lib

    是boost 的.so 文件路径

    -lboost_system

    这个是从网上找的,是指定编译的时候使用的库

    如果不加入这个,会出现如下错误:

    testSocketServer.cpp:(.text+0x447): undefined reference to `boost::system::generic_category()'
    testSocketServer.cpp:(.text+0x451): undefined reference to `boost::system::generic_category()'
    testSocketServer.cpp:(.text+0x45b): undefined reference to `boost::system::system_category()'
    /tmp/ccUZPY7m.o: In function `boost::system::error_code::error_code()':
    testSocketServer.cpp:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x10): undefined reference to `boost::system::system_category()'
    /tmp/ccUZPY7m.o: In function `boost::asio::error::get_system_category()':
    testSocketServer.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[boost::asio::error::get_system_category()]+0x7): undefined reference to `boost::system::system_category()'
    collect2: ld returned 1 exit status

    如果你的boost 库没有加进环境变量,运行会报错

    查看库依赖关系:

    ldd test

    如果没有正确找到相应的库,会出现

    libboost_system.so.1.55.0 => not found

    增加环境变量

    BOOST_ROOT=/opt/boost_1_55_0
    BOOST_LIB=/usr/local/lib
    BOOST_INCLUDE=/usr/local/include/boost
    LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH}
    export BOOST_ROOT BOOST_LIB BOOST_INCLUDE LD_LIBRARY_PATH

    再执行   ldd test,发现依赖的库在找到了

    这时候,你就可以运行刚刚编译的程序了。

  • 相关阅读:
    android studio 中如何合并冲突(转)
    关于学习ZigBee的书籍
    多一点学习之外的人文思考
    有关技术文档的一点感想
    有关文学知识对我大学生活的影响
    【转】华为PCB布线规范
    【转】怎么样从一个疯狂下载者成为一个学习者!!!值得反省下的问题·~~
    时钟1
    关于有源滤波器和无源滤波器
    【转】zz个人的制板习惯流程
  • 原文地址:https://www.cnblogs.com/chenfool/p/3719428.html
Copyright © 2020-2023  润新知