UNIX网络编程读书笔记

   这一段在看《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方案会比前两个方案要好一些。

你可能感兴趣的:(UNIX网络编程读书笔记)