2013年1月18日
摘要: 长连接和短连接TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在通信方式和报文格式的多样性上。通信方式 主要有以下三大类:(一)SERVER/CLIENT方式1.一个Client方连接一个Server方,或称点对点(peer to peer):2.多个Client方连接一个Server方,这也是通常的并发服务器方式。(二)连接方式1.长连接Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,可以用下面命令查看连接是否建立:netstat-f inet|grep端口号(如5678)。 此种方式常用于点对点通讯。2.短 阅读全文
posted @ 2013-01-18 11:40 一个人的天空@ 阅读(1378) 评论(0) 推荐(0)
摘要: epoll是做为一个虚拟文件系统来实现的,这样做至少有以下两个好处:1、可以在内核里维护一些信息,这些信息在多次epoll_wait间是保持的,比如所有受监控的文件描述符。2、epoll本身也可以被poll/epoll; 【1】epoll的实现中,所等待的设备就绪后,便调用call_back函数,把该设备加入到就绪队列中,避免了像poll那样设备就绪后再次轮询所有设备找就绪者,由O(n)降到O(1)。 传统的poll函数相当于每次调用都重起炉灶,从用户空间完整读入ufds,完成后再次完全拷贝到用户空间,另外每次poll都需要对所有设备做至少做一次加入和删除等待队列操作,这些都是低效的原因。3、 阅读全文
posted @ 2013-01-18 11:30 一个人的天空@ 阅读(263) 评论(0) 推荐(0)
摘要: 1、epoll使用模型示例程序1View Codefor(;;){ nfds = epoll_wait(epfd, events, 20, 500); for(i =0; i < nfds; ++i) { if(events[i].data.fd == listenfd) //监测到有新的连接 { connfd = accept(listenfd, (sockaddr *)&clientaddr, &clilen); //accept这个连接 ev.data.fd = connfd; ... 阅读全文
posted @ 2013-01-18 11:20 一个人的天空@ 阅读(287) 评论(0) 推荐(0)
摘要: 1、基于概念 epoll是一种机制,来处理大量并发连接时事件的读写顺序。在linux的网络编程中,很长的时间都在使用select来做事件触发。2.5.X内核后,引入epoll。epoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。因为它不会复用文件描述符集合来传递结果而迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的 阅读全文
posted @ 2013-01-18 10:30 一个人的天空@ 阅读(350) 评论(0) 推荐(0)
摘要: 1、recv和send函数提供了和read和write差不多的功能。但是他们提供了第四个参数来控制读写操作.int recv(int sockfd,void *buf,int len,int flags)int send(int sockfd,void *buf,int len,int flags)前面的三个参数和read,write相同,第四个参数能够是0或是以下的组合:_______________________________________________________________| MSG_DONTROUTE |不查找路由表|| MSG_OOB |接受或发送带外数据|| MS 阅读全文
posted @ 2013-01-18 09:59 一个人的天空@ 阅读(8531) 评论(0) 推荐(0)
摘要: 1、一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态2、SO_REUSEADDR和SO_REUSEPORTSO_REUSEADDR提供如下四个功能:SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重 阅读全文
posted @ 2013-01-18 09:54 一个人的天空@ 阅读(64508) 评论(0) 推荐(5)
摘要: 10、Linux环境下的##连接符与args...混合使用 前面【1】中叙述了#,##的使用方法,【2】中叙述了va_list的使用方法。【1】http://www.cnblogs.com/mydomain/archive/2010/09/25/1834917.html【2】http://www.cnblogs.com/mydomain/archive/2010/12/06/1898187.html在Linux下,还有一种使用形式,如下:#define NO_DATA(fmt, args...) \{\fprintf(stdout, fmt, ##args);\}int main(int ar 阅读全文
posted @ 2013-01-18 09:45 一个人的天空@ 阅读(396) 评论(0) 推荐(0)
摘要: 1、fcntl头文件#include <fcntl.h>#include <fcntl.h>定义函数int fcntl(int fd , int cmd);int fcntl(int fd,int cmd,long arg);int fcntl(int fd,int cmd,struct flock * lock);fcntl()用来操作文件描述符的一些特性。参数fd代表欲设置的文件描述词,参数cmd代表欲操作的指令。其详细情况见参考中。【1】http://linux.die.net/man/2/fcntl【2】http://baike.baidu.com/view/1 阅读全文
posted @ 2013-01-18 09:16 一个人的天空@ 阅读(1524) 评论(0) 推荐(0)