网络第五章:多路转接

一、铺垫

1.HTTP1.0采用了短链接的方式来进行通信:每一次建立连接,服务器响应完之后,会断开连接

于是产生了一个重要的问题:每一次链接都会进行TCP的三次握手,4次挥手,增加了通信的成本

2.HTTP1.1采用了长连接的方式来进行通信:建立连接,服务器响应完之后,不断开连接,活跃的用户对服务器发送请求,服务器都会正常响应;对不活跃的用户,不进行任何操作;并提出了时间机制;在相对时间内,如果用户不进行操作,则会断开连接;

3.短连接方式,多采用线程池的方法来进行后端的处理

4.长连接方式,在短链接基础上,使用多路转接的方式,来区分活跃用户和非活跃用户来进行服务器响应;使得单进程可以当伪多线程使用,大大提高了效率;

二、Epoll

epoll存在三个相关系统调用

1.epoll_create

int epoll_create(int size);         //创建一个 epoll 的句柄 .
返回值:是一个文件描述符
自从 linux2.6.8 之后, size 参数是被忽略的 .
用完之后 , 必须调用 close() 关闭

2.epoll_ctl

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll的事件注册函数.
在这里先注册要监听的事件类型 .
第一个参数是 epoll_create() 的返回值 (epoll 的句柄 ).一个文件描述符
第二个参数代表,要对参数监视的文件描述符进行什么操作,用三个宏来表示 .
第三个参数是需要监听的 fd(文件描述符)
第四个参数是告诉内核需要监听什么事
第二个参数的取值:

比如:EPOLL_CTL_ADD,向特定的文件描述符怎加一个特定的监听事件;

EPOLL_CTL_ADD :注册新的 fd epfd 中;
EPOLL_CTL_MOD :修改已经注册的 fd 的监听事件;
EPOLL_CTL_DEL :从 epfd 中删除一个 fd
第四个参数的结构如下:

typedef union epoll_data{

  void *ptr;

  int fd;

  uint32_t u32;

  uint64_t u64;

} epoll_data_t;

struct epoll_event{

  uint32_t events;          /* Epoll events */

  epoll_data_t data;      /* User data variable */

} __EPOLL_PACKED;

结构体epoll_event 中的events是以下几个宏的集合:但是远不止这些;

EPOLLIN : 表示对应的文件描述符可以读 ( 包括对端 SOCKET 正常关闭 );
EPOLLOUT : 表示对应的文件描述符可以写 ;
EPOLLPRI : 表示对应的文件描述符有紧急的数据可读 ( 这里应该表示有带外数据到来 );
EPOLLERR : 表示对应的文件描述符发生错误 ;
EPOLLHUP : 表示对应的文件描述符被挂断 ;
EPOLLET : EPOLL 设为边缘触发 (Edge Triggered) 模式 , 这是相对于水平触发 (Level Triggered) 来说的 .
EPOLLONESHOT :只监听一次事件 , 当监听完这次事件之后 , 如果还需要继续监听这个 socket 的话 , 需要再次把这个socket 加入到 EPOLL 队列里
epoll通过这些值的设定,来监视fd的行为,如果fd做了这些行为,则会通过epoll_wait来反馈给上层,进行处理

3.epoll_wait

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
收集在epoll监控的事件中已经发送的事件.
第一个参数:创建epoll时,分配的文件描述符
第二个参数:events是分配好的epoll_event结构体数组.epoll将会把发生的事件赋值到events数组中 (events不可以是空指针,内核只负责把数据复制到这个events数组中,不会去帮助我们在用户态中分配内存).
第三个参数:maxevents告之内核这个events有多大,这个 maxevents的值不能大于创建epoll_create()时的size.
第四个参数:timeout是超时时间 (毫秒,0会立即返回非阻塞模式,-1是永久阻塞).
返回值:如果函数调用成功,返回对应I/O上已准备好的文件描述符数目,如返回0表示已超时, 返回小于0表示函数失败

你可能感兴趣的:(网络编程,c语言,c++,Linux)