浮萍晓生的开发日志

记录学习的旅程,把握可预见的未来

导航

文章分类 -  NetWork IO

摘要:1、描述 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。 用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经离线。用于检测TCP的异常断开。基本原因是服务器端不能有效的判断客户端是否在线,也就是说,服务器无法区分客户端是长时间在空闲,还是已经掉线的情况。所谓的心跳包就是客户端定时发送简单的信息给服务器端告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开.. 阅读全文

posted @ 2014-03-20 10:13 浮萍晓生 阅读(2944) 评论(0) 推荐(1)

摘要:IOCP(I/O Completion Port,I/O完成端口)是性能最好的一种I/O模型。它是应用程序使用线程池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个线程来应答请求。这样就有很多的线程并行地运行在系统中。而这些线程都是可运行的,Windows内核花费大量的时间在进行线程的上下文切换,并没有多少时间花在线程运行上。再加上创建新线程的开销比较大,所以造成了效率的低下。调用的步骤如下:抽象出一个完成端口大概的处理流程:1:创建一个完成端口。2:创建一个线程A。3:A线程循环调用GetQueuedCompletionStatus()函数来 阅读全文

posted @ 2014-03-18 14:12 浮萍晓生 阅读(144) 评论(0) 推荐(0)

摘要:最近在看memcached的源码,觉得它那种libevent+多线程的服务器模型(multi-reactor)真的很不错,我将这个模型封装成一个C++类,根据我的简单测试,这个模型的效率真的很不错,欢迎大家试用。这个类的使用方法很简单(缺点是不太灵活),只要派生一个类,根据需要重写以下这几个虚函数就行了://新建连接成功后,会调用该函数 virtual void ConnectionEvent(Conn *conn) { } //读取完数据后,会调用该函数 virtual void ReadEvent(Conn *conn) { } //发送完成功后,会调用该函数(因为串包的问题,所以... 阅读全文

posted @ 2014-03-14 18:30 浮萍晓生 阅读(1149) 评论(0) 推荐(0)

摘要:在linux平台上使用c开发网络程序的同志们一般情况下都对鼎鼎大名的libevent非常的熟悉了。但是一些新进入此领域的new new people们对此都是一头雾水。原本的迷茫再加上开源软件一贯的“帮助文件”缺失作风,让我们这些新手们显的非常的无助。幸好有一些热心的朋友们帮忙,才化险为夷啊! 前几天一直在开发一个locker server,虽然公司现有的locker server能很好的运转,但是毕竟是net的,通用性不广,当我们要在linux上开发多集群系统的时候现有的locker server就未免显得有点捉襟见肘了。正是在开发locker server的过程中使用到了libevent。 阅读全文

posted @ 2014-03-14 18:07 浮萍晓生 阅读(1411) 评论(0) 推荐(0)

摘要:1、前言 在网络编程中,阻塞、非阻塞、同步、异步经常被提到。unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解。网上有详细的分析:http://blog.csdn.net/historyasamirror/article/details/5778378。我结合网上博客和书总结一下,加以区别,加深理解。2、数据流向 网络IO操作实际过程涉及到内核和调用这个IO操作的进程。以read为例,read的具体操作分为以下两个部分: (1)内核等待数据可读 (2)将内核读到的数据拷贝到进程详细过程如下图所示:3、网络I... 阅读全文

posted @ 2014-03-14 17:47 浮萍晓生 阅读(84) 评论(0) 推荐(0)

摘要:1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。 (4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。 (5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销... 阅读全文

posted @ 2014-03-14 14:47 浮萍晓生 阅读(140) 评论(0) 推荐(0)

摘要:1. asio::buffer常用的构造方法asio::buffer有多种的构造方法,而且buffer大小是自动管理的1.1 字符数组char d1[128]; size_t bytes_transferred = socket.receive(boost::asio::buffer(d1)); 1.2 字符向量std::vector d2(128); size_t bytes_transferred = socket.receive(boost::asio::buffer(d2)); 1.3 boost的数组boost::array d3; size_t bytes_transfer... 阅读全文

posted @ 2014-02-27 16:14 浮萍晓生 阅读(5373) 评论(0) 推荐(0)

摘要:deadline_timer和socket一样,都用io_service作为构造函数的参数。也即,在其上进行异步操作,都将导致和io_service所包含的iocp相关联。这同样意味着在析构 io_service之前,必须析构关联在这个io_service上的deadline_timer。1. 构造函数在构造deadline_timer时指定时间。basic_deadline_timer( boost::asio::io_service & io_service); basic_deadline_timer( boost::asio::io_service & io_... 阅读全文

posted @ 2014-02-27 16:02 浮萍晓生 阅读(980) 评论(0) 推荐(0)

摘要:无论如何使用,都能感觉到使用boost.asio实现服务器,不仅是一件非常轻松的事,而且代码很漂亮,逻辑也相当清晰,这点上很不同于ACE。使用io_service作为处理工作的work pool,可以看到,就是通过io_service.post投递一个Handler到io_service的队列,Handler在这个io_service.run内部得到执行,有可能你会发现,io_services.dispatch的接口也和io_service.post一样,但不同的是它是直接调用而不是经过push到队列然后在io_services.run中执行,而在这个示例当中,显然我们需要把工作交到另一个线程 阅读全文

posted @ 2014-02-27 15:07 浮萍晓生 阅读(363) 评论(0) 推荐(0)

摘要:io_service::work类可以使io_service::run函数在没有任务的时候仍然不返回,直至work对象被销毁。void test_asio_nowork(){ boost::asio::io_service ios; PRINT_DEBUG("ios before"); ios.run(); PRINT_DEBUG("ios end");}void test_asio_work(){ boost::asio::io_service ios; // 增加一个work对象 boost::asio::io_service::work work. 阅读全文

posted @ 2014-02-27 14:43 浮萍晓生 阅读(465) 评论(0) 推荐(0)

摘要:io_service的作用io_servie实现了一个任务队列,这里的任务就是void(void)的函数。Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用。Io_service是完全线程安全的队列。Io_servie的接口提供的接口有run、run_one、poll、poll_one、stop、reset、dispatch、post,最常用的是run、post、stopIo_servie实现代码的基本类结构:Io_servie是接口类,为实现跨平台,采用了策略模式,所有接口均有impl_ 阅读全文

posted @ 2014-02-26 18:05 浮萍晓生 阅读(188) 评论(0) 推荐(0)

摘要:boost::asio 在创建io_service时,可以指定线程数,如果没有指定,默认是一个线程,也就是io_service run的那个线程,如果没有任务运行,该线程会退出。 如果在创建的时候指定了线程数,那么io_service在执行的时候线程数就可以并发执行,如果你run的线程还是只有1个,那么io_service想多线程执行也没有条件,asio在内部是没有创建多线程的,所以这个时候需要你来手动创建多个线程执行io_service的run操作,这样才可以提高效率。顺便说下,worker辅助类可以保证ioservice一直run下去,直到调用stop,才会退出,这个是个很不错的用法... 阅读全文

posted @ 2014-02-26 14:31 浮萍晓生 阅读(507) 评论(0) 推荐(0)

摘要:BOOST::ASIO为我们提供了两种I/O机制,分别是同步和异步。它可在多平台上移植,在不同系统上采用了不同的实现。ASIO为我们封装了一系列的socket api,同时为我们提供了一套相当完善的服务器编程体系,部分概念(关键词)如:io队列、基于回调的异步通知、定时器、自定义的多线程机制。假设大家已经安装好了boost,并有一些C++基础,针对TCP服务器编程,我们有如下需求:1.一个可用于接受新连接的类2.提供基本的send/recv io操作3.解决多线程下的资源竞争问题4.管理连接的生命周期5.为不同的网络事件提供回调方法针对以上需求,先来设计一个简单的框架。我们分为TCPServe 阅读全文

posted @ 2014-02-20 13:02 浮萍晓生 阅读(595) 评论(0) 推荐(0)

摘要:Thrift是Facebook自己开发的一个跨语言的网络通信框架,Facebook前端主要是PHP开发,后面很多服务则是C++或者Java开发的,比如他们的搜索服务就是C++的,为了能用不同语言来相互调用这些服务,所以他们开发了Thrift,来为不同语言提供一个一致的通信界面。ICE就不多说了,它的全称就是Internet Communications Engine,我们现在就在大面积的使用它,下面主要比较下这两个框架的:1。跨语言两个框架都很好的做到了这一点,主流的开发语言C++,Java,Python,Ruby等等都能支持。2。代码生成两个框架都有自己的IDL,(Interface Def 阅读全文

posted @ 2014-01-20 18:31 浮萍晓生 阅读(662) 评论(0) 推荐(0)

摘要:创建buffer在io操作中,对数据的读写大都是在一个缓冲区上进行的,在asio框架中,可以通过asio::buffer函数创建一个缓冲区来提供数据的读写。buffer函数本身并不申请内存,只是提供了一个对现有内存的封装。chard1[128];size_tbytes_transferred = sock.receive(asio::buffer(d1));直接用字符串做buffer也是常见的形式:stringstr =" hello world ";size_tbytes_transferred = sock.send(asio::buffer(str));除了这些基础类 阅读全文

posted @ 2014-01-08 11:10 浮萍晓生 阅读(190) 评论(0) 推荐(0)

摘要:asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程。客户端客户端的代码如下: #include #include #include using boost::asio::ip::tcp; int main(int argc, char* argv[]) { try { boost::asio::io_service io_service; tcp::endpoint end_point(... 阅读全文

posted @ 2014-01-08 11:05 浮萍晓生 阅读(175) 评论(0) 推荐(0)

摘要:IO模型io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象)。asio::io_serviceio_service;asio::ip::tcp::socketsocket(io_service);在asio框架中,同步的io主要流程如下:应用程序调用IO对象成员函数执行IO操作IO对象向io_service 提出请求.io_service 调用操作系统的功能执行连接操作.操作系统向io_service 返回执行结果.io_service将错误的操作结果翻译为boost::system::error 阅读全文

posted @ 2014-01-08 10:58 浮萍晓生 阅读(131) 评论(0) 推荐(0)

摘要:同步Timerasio中提供的timer名为deadline_timer,它提供了超时计时的功能。首先以一个最简单的同步Timer为例来演示如何使用它。 #include #include int main() { boost::asio::io_service io; boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3)); timer.wait(); std::cout timer_callback ; voi... 阅读全文

posted @ 2014-01-08 10:33 浮萍晓生 阅读(234) 评论(0) 推荐(0)

摘要:什么是HTTP协议协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器目前我们使用的是HTTP/1.1 版本Web服务器,浏览器,代理服务器当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?实际上我们输入URL后,我们的浏览器给Web服务器发送了一个Request, Web服务器接到Request后进行处理,生成相应的Response,然后发送给浏览器, 浏览器解析Response中的HTML,这样我们就看到了网页,过程如下图所示 阅读全文

posted @ 2013-12-31 14:12 浮萍晓生 阅读(128) 评论(0) 推荐(0)

摘要:服务端: #include #include #include #include #include using boost::asio::ip::tcp;#define max_len 1024class clientSession :public boost::enable_shared_from_this{public: clientSession(boost::asio::io_service& ioservice) :m_socket(ioservice) { memset(data_,'\0',sizeof(data_)); } ... 阅读全文

posted @ 2013-12-11 15:54 浮萍晓生 阅读(285) 评论(0) 推荐(0)