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 ...
随机推荐
- bootstrap之ScrollTo
ScrollTo package io.appium.android.bootstrap.handler; import com.android.uiautomator.core.UiObject; ...
- HDOJ How many ways?? 2157【矩阵高速幂】
How many ways? ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Js两种post方式(转)
第一种提交post的方式是传统方式,判断浏览器进行post请求. <SCRIPT stype=text/javascript> var xmlobj; //定义XMLHttpRequest ...
- 翻译:A Tutorial on the Device Tree (Zynq) -- Part II
A Tutorial on the Device Tree (Zynq) -- Part II 设备树结构 Zynq的设备树如下: /dts-v1/; / { #address-cells = < ...
- Android 实例解说加入本地图片和调用系统拍照图片
在项目的开发过程我们离不开图片.而有时候须要调用本地的图片,有时候须要调用拍照图片.同一时候实现拍照的方法有两种,一种是调用系统拍照功能.还有一种是自己定义拍照功能. 而本博文眼下仅仅解说第一种方法, ...
- bash命令中的两个横
它是一种标记.命令中的连续的两个横表明选项已经结束了,两个横后面的内容就是参数了,不再是选项了.
- Java programming language compiler
https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html\ javac - Java programming l ...
- mysql数据库隔离级别及其原理、Spring的7种事物传播行为
一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...
- code::Blocks 汉化经验
首先,在网上下载一个code::Block的汉化包 code::Block汉化包下载地址,复制到地址栏即可. http://files.cnblogs.com/files/QW-lzm/codebl ...
- Silverlight实用窍门系列:2.Silverlight动态加载外部XML指定地址的WebService---(动态加载外部XML文件中指定的WebService地址)【附带实例源码】
接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以此加载这个地址来动态加载WebService呢?这样子就 ...