摘要: 最近几天在公司里写网络通讯的代码比较多,自然就会涉及到IO事件监测方法的问题。我惊奇的发现select轮训的方法在那里居然还大行其道。我告诉他们现在无论在Linux系统下,还是windows系统下,select都应该被废弃不用了,其原因是在两个平台上select的系统调用都有一个可以说是致命的坑。 阅读全文
posted @ 2014-08-30 16:41 lanyuliuyun 阅读(4932) 评论(0) 推荐(2)
摘要: 基于Linux-2.6.30版本,具体实现net\ipv4\netfilter目录下,入口文件为net\ipv4\netfilter\iptable_filter.c,入口/出口函数为模块的init函数iptable_filter_init()和uninit函数iptable_filter_fini... 阅读全文
posted @ 2014-07-14 11:55 lanyuliuyun 阅读(2139) 评论(0) 推荐(0)
摘要: shared_ptr::operator->返回的是T*类型指针,非const T*指针。因此通过const shared_ptr&类型的ptr可以直接调用T各个原始的方法,不用担心const与非const问题。具体shared_ptr::operator->实现如下,摘自boost1.52.0版本... 阅读全文
posted @ 2014-07-07 14:39 lanyuliuyun 阅读(1118) 评论(0) 推荐(0)
摘要: 被问到如何手动获取当前的调用栈,之前碰到过一时没记起来,现在回头整理一下。 其原理是:使用backtrace()从栈中获取当前调用各层函数调用的返回地址,backtrace_symbols()将对应地址翻译成对应的符号信息,这两个函数在execinfo.h中声明。详细用法见后面的example。这里 阅读全文
posted @ 2014-06-29 16:54 lanyuliuyun 阅读(4655) 评论(0) 推荐(0)
摘要: 主动建立TCP链接情况:被动建立TCP链接情况主动断开链接的情况被动断开连接的情况在TIME_WAIT阶段需要停留2倍的MSL,MSL即Maximum Segment Lifetime,表示任何报文被丢弃前在网络内的最长时间,TCP/IP详解中额外注解了:RFC793指出MSL为2min,然而实现中... 阅读全文
posted @ 2014-06-28 21:19 lanyuliuyun 阅读(319) 评论(0) 推荐(0)
摘要: 阿里核心系统团队博客http://csrd.aliapp.com/?p=1055记录了主动关闭TCP socket时,可能不发fin包,而是发rst的问题。其原因是主动关闭socket时,若接收buffer里还有报文尚未收取,则本段将以rst包替代正常情况下的fin包。详细的代码在net/ipv4/... 阅读全文
posted @ 2014-06-11 23:22 lanyuliuyun 阅读(665) 评论(0) 推荐(0)
摘要: 首先这是从酷壳网看到陈皓和云风两位大牛们讨论的一个问题,这里记录一下自己的理解。问题如下,先看一段代码 1 #include <iostream> 2 using namespace std; 3 4 class Base 5 { 6 public : 7 Base(){} 8 virtual ~Base(){ 9 cout<<"Base::~Base()"<<endl;10 }11 };12 13 class Derived : public Base14 {15 public:16 Derived(){}17 virtual ~De. 阅读全文
posted @ 2013-05-01 12:52 lanyuliuyun 阅读(1551) 评论(5) 推荐(1)
摘要: 在编写win32 GUI相关的程序的时候,最直接的方法是使用GDI API进行绘制操作。一般为了图形绘制过程中为避免绘制过程闪动,而多采用双Buffer的做法,具体是先在一个内存DC中线将图像绘制好,然后采用BitBlt函数将该内存DC中绘制好的图像贴到目标DC中(该目标DC即是待绘制窗口的DC)。在内存DC中绘图的时候,需先创建该DC,然后根据需要创建各种Pen,各种Brush,将Pen/Brush选进去,绘制完成之后,再将原来的Pen/Brush选回去,最后执行InvalidateRect函数使窗口中的指定区域无效,触发WM_PAINT消息,在响应WM_PAINT消息中,执行BitBlt函 阅读全文
posted @ 2013-04-29 13:33 lanyuliuyun 阅读(1447) 评论(5) 推荐(0)
摘要: C++中除了沿用C的alloc系列函数之外,还可以用new/new []来分配内存(这句是废话),我们在使用new这个operator的时候多是直接使用,而没有额外引用头文件。写C语言代码写习惯的人都会在alloc函数之后,对指针做NULL判断,以检查内存分配是否成功,那么在C++中是否也需要以同样的方式来检查内存分配是否成功呢?根据实际code验证结果,答案是new成功返回即表示内存分配成功,不需检查指针是否为NULL,但是仍然会出现内存分配失败的情况,此时需要捕捉bad_alloc这种exceptin来知晓内存分配失败,bad_alloc是在new这个C++头文件(#include < 阅读全文
posted @ 2013-04-25 00:17 lanyuliuyun 阅读(1210) 评论(0) 推荐(0)
摘要: 1 #include 2 #include 3 4 using namespace std; 5 6 int main(int argc, char *argv[]) 7 { 8 binder1st > big = bind1st(greater(), 3); 9 int value = 4;10 11 if (big(value))12 {13 cout > big = bind1st(greater(), 3);这一句,其中拆开来,是由以下几个部分组成greater()是将greater::operator()传给bind1st()... 阅读全文
posted @ 2013-04-10 23:10 lanyuliuyun 阅读(605) 评论(0) 推荐(0)