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(), ));
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 ; }
代码几乎直接贴参考文章的。
编译命令:
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 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,发现依赖的库在找到了
这时候,你就可以运行刚刚编译的程序了。
boost 编译 asio 程序,简单socket 编程的更多相关文章
- boost编译配置及简单使用
boost编译配置及简单使用 1.下载 http://www.boost.org/ 2.编译: A.解压 boost_1_55_0.zip 到boost路径 B.运行 bootstrap.bat. 会 ...
- PHP简单socket编程
今天再看一点邮件发送的功能,所以了解一下socket变成,看到了一篇不错的文章,转发过来做个笔记吧. 原文链接:http://www.cnblogs.com/thinksasa/archive/201 ...
- 基于java的简单Socket编程
1TCP协议与UDP协议 1.1 TCP TCP是(Tranfer Control Protocol)的简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输 ...
- Python之简单Socket编程
Socket编程这块儿还是比较重要的,记录一下:实现服务器端和客户端通信(客户端发送系统指令,如ipconfig等,服务器端执行该指令,然后将指令返回结果给客户端再传过去,设置一次最多直接收1024字 ...
- 简单socket()编程
客户端: 1.socket( int af, int type, int protocol) socket()函数用于根据指定的地址族.数据类型和协议来分配一个套接口的描述字及其所用的资源.如果协议p ...
- php之简单socket编程
一.什么是套接字 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字.其用于标识客户端请求的服务器和服务. 二.php套接字实例 服务端代码:socket.php <?php er ...
- boost.asio系列——socket编程
asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...
- [JavaWeb基础] 024.Socket编程之简单的聊天程序
1.Socket的简介 1)什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket ...
- C# socket编程实践——支持广播的简单socket服务器
在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...
随机推荐
- ruby rails
http://www.zhihu.com/question/19552402 作者:陈振宇链接:http://www.zhihu.com/question/19552402/answer/1236 ...
- USB/IP项目总结
青云最近推出了云桌面功能,用户可以像使用本地计算机一样访问远程主机,支持USB重定向,不禁让我想起了2年前调试的一个开源项目USB/IP,当时还用英文写了一个总结性文档,放在这里方便以后查看. ...
- linux 文件记录锁详解
一: linux记录锁更恰当的称呼应该是范围锁,它是对文件某个范围的锁定. 关于记录锁的功能就是fcntl提供的第五个功能,具体使用如下: int fcntl(int fd, int cmd, str ...
- 浅谈JavaScript的事件(事件委托)
事件处理程序为Web程序提供了系统交互,但是如果页面中的事件处理程序太多,则会影响页面的性能.每个函数都是对象,都会占用内存,内存中对象越多,性能越差.需要事先为DOM对象指定事件处理程序,导致访问D ...
- 设计模式学习笔记——Decorator装饰模式
装饰模式的作用或动机就是,尽量避免继承,而使用关联.原因是层层继承下来,内容会越来越多,有失控的危险.就扩展性而言,用关联比用继承好.所谓的关联,A使用了B,就叫A关联了B. Component 抽象 ...
- Principle of least astonishment
Principle of least astonishment - Wikipedia https://en.wikipedia.org/wiki/Principle_of_least_astonis ...
- 在C++中使用Libmd5计算字符串或文件的MD5值
CppMD5Demo.cpp #include <iostream> #include <fstream> #include <chrono> #include & ...
- Vijos 1921 严厉的班长 【状态压缩动态规划】
严厉的班长 描述 木姑娘在班级里面是班长.虽然是副班长,却有着比正班长更高的威信,并深受小朋友们的爱戴. 每天眼保健操时间,木姑娘都要监督所有小朋友认真做眼保健操.整个过程被描述为n个时间段,第i个时 ...
- date format记录
各种日期格式定义,容易忘记,这里备注下: * 支持格式为 yyyy.MM.dd G 'at' hh:mm:ss z 如 '2002-1-1 AD at 22:10:59 PSD'<br> ...
- SpringBoot配置文件详解
自定义属性与加载 com.dongk.selfproperty.title=wangdkcom.dongk.selfproperty.name=10000 然后通过@Value("${属性名 ...