Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42732
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-22 19:27
文章分类
文章存档

2017年(1)

2014年(2)

2013年(5)

我的朋友

分类: LINUX

2013-11-04 08:51:50

http://www.cppblog.com/whspecial/archive/2013/10/31/204011.html
这一段在看《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,链接如下:
   这里记录的是很简单的几种多线程TCP服务器模型,顺便可以比较下:
   2.1 主线程accept,为每个client创建一个线程
   2.2 使用线程池,全部accept,当有连接来的时候其中某个线程进行处理
   2.3 使用线程池,主线程accept,当有连接来的时候主线程将其放入队列,由工作线程进行处理(生产者-消费者模型)
   1方案过于频繁地进行线程创建销毁,2方案在一个连接过来时会带来惊群现象,3方案会比前两个方案要好一些。
阅读(1314) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~