Posted on 2013-10-31 00:32
whspecial 阅读(2716)
评论(1) 编辑 收藏 引用 所属分类:
linux编程
这一段在看《unix网络编程》,回顾之前做项目用到的一些东西,在这里总结一下:
(1)TCP套接口编程 这里介绍各个接口函数:
1 文件描述符 -socket(int domain, int type, int protocol); //生成文件描述符 -bind(int sockfd, struct sockaddr *my_addr, int addrlen); //将本地的一个端口绑定到fd上,一般只需要在server端 2 服务端 -listen(int sockfd, int backlog); //有两个作用:1,将主动套接口变为被动套接口;2,设置最大连接数backlog -accept(int sockfd, void *addr, int *addrlen); //为建立好的连接生成一个新的fd 3 客户端 -connect(int sockfd, struct sockaddr *serv_addr, int addrlen); //进行socket连接 4 通信 -send(int sockfd, const void *msg, int len, unsigned int flags); //发送请求 -recv(int sockfd, void *buf, int len, unsigned int flags); //接收请求
(2)I/O多路复用 I/O多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。按照《UNIX网络编程》的说法,I/O多路复用用于以下三种情况:
a)一个TCP服务器既要处理监听套接口,又要处理已连接套接口;
b)一个服务器既要处理TCP,又要处理UDP;
c)当客户端处理多个描述字(比如处理交互式输入和网络套接口)
目前被广泛使用的是select和epoll:
2.1,select
int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)
第一个参数指定最大的fd数目,中间三个分别是被监控的读、写、异常的fd集,最后一个是超时时间。select函数会阻塞等待,直到监控的fd集中有fd就绪,或者已经超时。
2.2,epoll
epoll相比于select,主要的好处在于它不像select一样去轮询fd集,而是由内核去触发;另外它支持更大的fd个数
(3)网络服务器模型 其实网络服务器模型还是比较复杂的,有一篇比较经典的文章叫做c10K problem,链接如下:
http://www.kegel.com/c10k.html 这里记录的是很简单的几种多线程TCP服务器模型,顺便可以比较下:
2.1 主线程accept,为每个client创建一个线程
2.2 使用线程池,全部accept,当有连接来的时候其中某个线程进行处理
2.3 使用线程池,主线程accept,当有连接来的时候主线程将其放入队列,由工作线程进行处理(生产者-消费者模型)
1方案过于频繁地进行线程创建销毁,2方案在一个连接过来时会带来惊群现象,3方案会比前两个方案要好一些。