本身第一次玩boost,對C++也很是不熟悉,記錄一下本身的學習過程。html
安裝編譯ios
boost 包解壓到/opt下編程
tar -zxvf /media/C06EDE596EDE47B4/mnt/boost_1_55_0.tar.gz -C /opt
首先執行生成b2的腳本bootstrap
/opt/boost_1_55_0/bootstrap.sh
編譯boost 與安裝socket
/opt/boost_1_55_0/b2 && /opt/boost_1_55_0/b2 install
安裝完成後,會在/usr/local/lib保存.so 與.a 文件,頭文件則存放在/usr/local/include/boost/路徑下tcp
參考文章:http://www.cnblogs.com/hcfalan/archive/2011/02/23/1962657.html學習
這篇博文不會講解代碼和原理,只是簡單記錄學習步驟。spa
#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; }
代碼幾乎直接貼參考文章的。code
編譯命令:htm
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,發現依賴的庫在找到了
這時候,你就能夠運行剛剛編譯的程序了。