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,發現依賴的庫在找到了

這時候,你就可以運行剛剛編譯的程序了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM