您的位置:首页 > 编程语言

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

2014-05-09 18:20 267 查看
自己第一次玩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,发现依赖的库在找到了

这时候,你就可以运行刚刚编译的程序了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: