c++ boost asio
文章平均质量分 67
炼气散人
等儿子高考后,或许会回来
展开
-
boost asio程序优雅的退出 一
当程序能够拦截kill进程的信号,然后清理资源再退出进程时,就是优雅的退出。boost的asio提供了这个机制。下面用最少的代码演示了这个功能:#include #include #include #include using namespace boost;using namespace boost::asio;using namespace std;io_service s原创 2013-01-12 22:44:46 · 8549 阅读 · 0 评论 -
boost::asio 连接管理6
先来一个newLISP程序测试,发起一个连接,发送一个正确字符'a',连接不断,再发送一个错误字符,连接断开。测试脚本如下:(define (quit-for-error) ((println (net-error)) (exit)))(set 'socket (net-connect "localhost" 8888))(if (net-send socket "a") (println原创 2013-01-15 20:25:11 · 3642 阅读 · 8 评论 -
boost::asio 连接管理11 如何关闭连接
在实际产品运行中,对连接管理有了更新的认识,这里分享一下。shared_ptr管理连接对象的生命周期shared_ptr的引用计数器决定了连接对象的生命周期。这里我说的连接对象就是在我的前文:http://blog.csdn.net/csfreebird/article/details/8522620中的Client对象:#include "core/connection.h"#include原创 2014-03-25 19:05:32 · 10202 阅读 · 2 评论 -
boost::asio async_write也不能保证一次发完所有数据 二
只有看boost源码才能弄明白发生了什么。首先我是将vector里面写入了数据,然后用boost::asio::buffer将vector构造成了mutable_buffer_1对象。参考该文档的重载形式:http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/buffer/overload24.htmlbuff原创 2013-07-01 22:54:58 · 5523 阅读 · 3 评论 -
boost::asio 连接管理9
这节先重构下代码,业务逻辑代码和通信基础设施代码需要解耦。业务逻辑代码处理通信过程中的协议,以及背后需要的应用逻辑。而通信基础设施代码专注于并发,TCP连接等特性。首先把前面的代码Connection的一些成员函数纯虚函数,业务类可以继承之,根据需要重写虚函数。Server类编程模板类,接受业务类作为模板参数,只要该类提供几个必须的公有成员函数即可。因此目录结构调整如下:├── CMakeList原创 2013-01-16 21:07:43 · 4138 阅读 · 3 评论 -
boost::asio 连接管理1
在完成了第一个基于boost::asio的通信服务程序后,回顾一下所用到的概念,参考一些资料。将用一个系列来归纳一下如何通过boost::asio编写高性能TCP服务程序。本篇从简单的单线程开始,描述如何监听端口,接收连接请求。同时也复用了前面的“优雅的退出” 的代码。首先main函数创建一个server对象,server对象负责监听本地8888端口,一旦有连接请求,则创建一个connection原创 2013-01-13 17:20:22 · 6222 阅读 · 2 评论 -
boost::asio async_write也不能保证一次发完所有数据 一
你要是看过basic_stream_socket的文档,里面提到async_write_some不能保证将所有要发送的数据都发出去。并且提到如果想这样做,需要使用boost asio的async_writehttp://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/basic_stream_socket/async_writ原创 2013-07-01 22:26:13 · 8258 阅读 · 2 评论 -
boost::asio 连接管理3
现在用newLISP编写TCP客户端来测试程序:chenshu@chenshu-beijing:~$ newlispnewLISP v.10.4.5 64-bit on Linux IPv4/6 UTF-8 libffi, execute 'newlisp -h' for more info.> (set 'socket (net-connect "localhost" 8888))3>原创 2013-01-14 00:25:01 · 3667 阅读 · 0 评论 -
boost::asio 连接管理2
从上一节的例子,可以得到一个推论,如果Connection对象中不再发起任何异步I/O操作,那么当最后一个回调函数执行完后,Connection对象将被销毁。我需要证明这个推论。如果连接建立后,StartWork发起一个异步调用等待数据,而在等待期间,Connection对象应该不会被销毁。一旦等待的数据到了,如果没有后续的io操作(write or read)的话,Connection对象就会被原创 2013-01-13 19:31:18 · 3543 阅读 · 0 评论 -
boost::asio 连接管理10
本篇应该是最后一篇了。给出一个完整的可以用于产品环境的代码。现在修改一下代码逻辑,让server变成一个echo服务器。收到16字节长度后,再接受字符串。然后返回16字节长度给客户端,再返回字符串。16字节长度类型是unsigned short,在网络传输的时候采用big-endian 字节顺序。字符串采用utf-8编码格式。先来看一下我的newLISP客户端模拟程序:(define (quit-原创 2013-01-20 19:20:45 · 7059 阅读 · 9 评论 -
我的开源小工程:echo-like server
这个echo-like server是基于boost asio实现的。用了这么久的其他人的开源项目,把自己的经验贡献出来还是第一次。因为如果光是用博客的话,代码分享比较困难。该项目网址为:https://github.com/csfreebird/asio_echo请注意几点:1.本项目采用CMake构建2.虽然没有使用平台相关的API,不过目前仅在Ubuntu平台测试3.采用了boost asi原创 2013-01-28 14:31:11 · 3859 阅读 · 7 评论 -
boost::asio 无法接受新连接的处理方法
写了一个压力测试程序,创建2000个连接,TCP server基于boost::asio实现。用kill杀掉2000个连接,再重新创建,如此反复多次后,TCP server不再接受新的连接,已经建立的连接仍然能够正常工作。用wc -l /proc/net/tcp 命令检查tcp 连接数,不存在大量未被系统关闭的连接。在stackoverflow上问了别人,帖子:http://stackoverfl原创 2013-11-30 23:50:02 · 6697 阅读 · 0 评论 -
boost::asio 连接管理5
重新看一下优雅的退出,还是有些不完善。因为当收到退出信号的时候,直接关闭了io_service,而不是关闭所有连接再退出。其实应该按照顺序做三件事情:1.拒绝新的TCP连接2.关闭所有已有的连接3.关闭io_service1很简单,只需要调用一次acceptor_.close()即可。2.每个Connection类应该提供一个CloseSocket方法,内部调用socket.close(). 同时原创 2013-01-14 20:32:26 · 4652 阅读 · 0 评论 -
boost::asio 连接管理8
到上一篇,一个完整的单线程版本就出现了。如果并发要求不高的话,单线程+异步I/O已经足够了。但是如果想支持大并发,自然需要尽可能的利用服务器上的多个CPU和核。现在首先把之前的工程改成cmake工程。顶层目录的CMakeLists.txt内容如下:cmake_minimum_required(VERSION 2.8)project (TcpTemplate)add_subdirectory(s原创 2013-01-16 16:52:01 · 6247 阅读 · 0 评论 -
boost::asio 连接管理4
this指针不能在这种情况下绑定后交给asio使用。那么怎么办?很简单,我之前的一篇文章介绍过enable_share_from_this。http://blog.csdn.net/sheismylife/article/details/8282518现在修改一下Connection类的代码:class Connection: public boost::enable_shared_from_th原创 2013-01-14 00:33:47 · 3640 阅读 · 1 评论 -
boost asio程序优雅的退出 二
前一篇非常简单,容易懂。不过用在C++中还是需要封装成可以多个项目中使用的代码。下面将全局变量取消,创建了一个Server类,提供了run函数,同时Server对象还监听信号量,从而优雅的退出。#include #include #include #include using namespace boost;using namespace boost::asio;using nam原创 2013-01-13 13:57:04 · 5685 阅读 · 0 评论 -
boost::asio 连接管理7
newLISP提供了简单的方法让我创建多个进程。下面的程序创建10个进程,每个进程发送几个'a', 最后发送一个'q'.(define (quit-for-error) ((println (net-error)) (exit)))(define (send-test) (set 'socket (net-connect "localhost" 8888)) (if (net-sen原创 2013-01-15 20:58:35 · 3601 阅读 · 0 评论