首页 > boost::asio中的C/S同步实例源码

boost::asio中的C/S同步实例源码

近来狂热地研究boost的开发技术,现将读书笔记整理如下:

需要说明的是, 本博该专题下面关于boost的源码是采用boost1.55版本, 运行在Ubuntu 14.04 64bit下面, 使用apt包安装(非源码编译安装), 后续不再做说明.

同步socket类型的服务器源码实现:

//g++ -g sync_tcp_server.cpp -o sync_tcp_server -lboost_system
//#include 
#include 
#include using namespace std;
using namespace boost::asio;int main(){try{cout << "sync tcp server start ......" << endl;io_service ios;//server listen at 127.0.0.1:6688ip::tcp::acceptor acceptor(ios, ip::tcp::endpoint(ip::tcp::v4(), 6688));cout << acceptor.local_endpoint().address() << endl;while(true){ip::tcp::socket sock(ios);acceptor.accept(sock);cout << "client: ";cout << sock.remote_endpoint().address() << endl;sock.write_some(buffer("hello asio"));}}catch(std::exception& e){cout << e.what() << endl;}
}

同步socket类型的客户端源码实现:

//g++ -g sync_tcp_client.cpp -o sync_tcp_client -lboost_system -lboost_date_time
//#include 
#include 
#include 
#include 
#include using namespace boost::asio;void client(io_service &ios){try {std::cout << "sync client starting ......" << std::endl;ip::tcp::socket sock(ios);ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 6688);sock.connect(ep);std::vector str(100, 0);sock.read_some(buffer(str));std::cout << "receive from: " << sock.remote_endpoint().address() << std::endl;std::cout << &str[0] << std::endl;} catch (std::exception &e) {std::cout << e.what() << std::endl;}
}class a_timer
{private:int count, count_max;boost::function f;boost::asio::deadline_timer t;public:templatea_timer(io_service &ios, int x, F func): f(func), count_max(x), count(0),t(ios, boost::posix_time::millisec(500)) {t.async_wait(boost::bind(&a_timer::call_func, this, boost::asio::placeholders::error));}void call_func(const boost::system::error_code&){if (count >= count_max) {return;}++count;f();t.expires_at(t.expires_at() + boost::posix_time::millisec(500));t.async_wait(boost::bind(&a_timer::call_func, this, boost::asio::placeholders::error));}};int main()
{io_service ios;a_timer at(ios, 5, boost::bind(client, boost::ref(ios)));ios.run();return 0;
}

运行细节:





注意所有的源码均在Ubuntu 14.04 64bit上运行测试, 比参考文献[1]中更详细更具体.



参考文献:

[1].罗剑锋, Boost程序库完全开发指南---深入C++"准"标准库

更多相关:

  • 异步模式的服务器源码 //g++ -g async_tcp_server.cpp -o async_tcp_server -lboost_system //#include #include #include #include

  • 经过长期探索,发现一个不需要手动设置线程休眠时间(e.g. std::this_thread::sleep_for(std::chrono::microseconds(1)))的代码: Github: https://github.com/log4cplus/ThreadPool #ifndef THREAD_POOL_H_7e...

  • nth_element(first,nth,last) first,last 第一个和最后一个迭代器,也可以直接用数组的位置。  nth,要定位的第nn 个元素,能对它进行随机访问. 将第n_thn_th 元素放到它该放的位置上,左边元素都小于它,右边元素都大于它. 测试代码: http://www.cplusplus.com...

  • c/c++老版本的rand()存在一定的问题,在转换rand随机数的范围,类型或者分布时,常常会引入非随机性。 定义在 中的随机数库通过一组协作类来解决这类问题:随机数引擎 和 随机数分布类 一个给定的随机数发生器一直会生成相同的随机数序列。一个函数如果定义了局部的随机数发生器,应该将(引擎和分布对象)定义为 st...

  • jsoncpp 是一个C++ 语言实现的json库,非常方便得支持C++得各种数据类型到json 以及 json到各种数据类型的转化。 一个json 类型的数据如下: {"code" : 10.01,"files" : "","msg" : "","uploadid" : "UP000000" } 这种数据类型方便我们人阅读以...

  • 问题如下: 已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子 集中的各个元素和为整数target的子集,结果中无重复的子集。 例如: nums[] = [10, 1, 2, 7, 6, 1, 5], target = 8 结果为: [[1, 7], [1, 2, 5], [2, 6], [1, 1, 6]] 同样之前有...

  • 通过实验取证:TCP三次握手的过程理解TCP/IP协议的工作原理多年来TCP/IP协议一直被公众称呼为“一个协议”,事实上它是一组协议的集合,IP工作在OSI七层模型的网络层,提供网络传输,但是并不提供其可靠性传输控制。而TCP工作在OSI七层模型的传输层,并提供其可靠性传输控制。那么首先需要说明的是:“什么是可靠性传输控制?”所谓可...