上一页 1 ··· 66 67 68 69 70 71 72 73 74 ··· 106 下一页
摘要: 一、一般用法我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.用法:#include<cstdio>#include<climits>using namespace std;#define STR(s) #s#define CONS(a,b) int(a##e##b)int main(){ printf(STR(vck)); // 输出字符串"vck" printf("%d", CONS(2,3)); // 2e3 输出:2000 return 0;}二、当宏参数是另一个宏的时候需要注意的是凡宏定义里有用'# 阅读全文
posted @ 2010-11-12 09:43 张长胜 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 指针数组与指向指针的指针http://wlkc.gdqy.edu.cn/jpkc/portal/blob?key=173314指针数组和数组指针的区别http://allew.blog.163.com/blog/static/3374389720094148449239/指针数组[组图]http://school.cnd8.com/c/jiaocheng/9212.htm函数指针和指针函数http://lionwq.spaces.eepw.com.cn/articles/article/item/18258========================================sour 阅读全文
posted @ 2010-11-11 18:31 张长胜 阅读(142) 评论(0) 推荐(0) 编辑
摘要: TCP连接断开的时候调用close socket函数,已经讨论过有优雅的断开和强制断开,那么如何设置断开连接的方式呢?是通过设置socket描述符一个linger结构体属性。linger结构体数据结构如下:struct linger { int l_onoff; int l_linger; }; 有三种组合方式:第一种 l_onoff = 0; l_linger忽略这种方式下,就是在closesocket的时候立刻返回,底层会将未发送完的数据发送完成后再释放资源,也就是优雅的退出.第二种 l_onoff非零 l_linger = 0;这种方式下,在调用close s... 阅读全文
posted @ 2010-11-11 17:16 张长胜 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 服务器关了正在连接的客户端socket_fd,客户端做出的反应过程当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。 根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。若不想客户端退出可以把SIGPIPE设为SIG_IGN如: signal(SIGPIPE,SIG_IGN);这时SIGPIPE交给了系统处理。 服务器采用了fork的话,要收集垃圾进程,防止... 阅读全文
posted @ 2010-11-11 17:08 张长胜 阅读(157) 评论(0) 推荐(0) 编辑
摘要: VIM REFERENCE MANUAL by Bram Moolenaarhttp://vimcdoc.sourceforge.net/doc/quickref.html#Q_viVIM 用户手册 - by Bram Moolenaarhttp://vimcdoc.sourceforge.net/doc/usr_03.html#03.8 阅读全文
posted @ 2010-11-11 15:27 张长胜 阅读(82) 评论(0) 推荐(0) 编辑
摘要: Source:#include <iostream> #include <list> #include <numeric> #include <algorithm> using namespace std; typedef list<int> LISTINT; //创建一个list容器的实例LISTINTtypedef list<int> LISTCHAR; //创建一个list容器的实例LISTCHARint main(void) { LISTINT listOne; //用LISTINT创建一个名为listOne的li 阅读全文
posted @ 2010-11-09 15:08 张长胜 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2010-11-08 10:31 张长胜 阅读(101) 评论(0) 推荐(0) 编辑
摘要: import structpack、unpack、pack_into、unpack_from# ref: http://blog.csdn.net/JGood/archive/2009/06/22/4290158.aspximport struct#pack - unpackprintprint '===== pack - unpack ====='str = struct.pack("ii", 20, 400)print 'str:', strprint 'len(str):', len(str) # len(str): 8 阅读全文
posted @ 2010-10-29 13:36 张长胜 阅读(371) 评论(0) 推荐(0) 编辑
摘要: 线程池的原理: 来看一下线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题??性能!就拿我所在的单位来说,我的单位是一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,如果为每. 阅读全文
posted @ 2010-10-29 11:17 张长胜 阅读(173) 评论(0) 推荐(0) 编辑
摘要: select的本质是采用32个整数的32位,即32*32= 1024来标识,fd值为1-1024。当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小。这个时候就可以标识32*max值范围的fd。对于单进程多线程,每个线程处理多个fd的情况,select是不适合的。1.所有的线程均是从1-32*max进行扫描,每个线程处理的均是一段fd值,这样做有点浪费2.1024上限问题,一个处理多个用户的进程,fd值远远大于1024所以这个时候应该采用poll,poll传递的是数组头指针和该数组的长度,只要数组的长度不是很长,性能还是很不错的,因为poll一次在内核中申请4K(一个页的大小来 阅读全文
posted @ 2010-10-28 14:20 张长胜 阅读(150) 评论(0) 推荐(0) 编辑
上一页 1 ··· 66 67 68 69 70 71 72 73 74 ··· 106 下一页