思路一:多线程并发
缺点:资源浪费过大,且能实现的并发量有限。
思路二:IO通信
1.阻塞IO
没有任务时,挂起任务,节省资源,提高效率
2.非阻塞IO
未收到数据时一直执行,效率很低
3.异步IO
只能绑定一个文件描述符来读取数据
4.多路复用IO
     4.1.select 
       int select(int nfds, fd_set *readfds, fd_set *writefds,
                   fd_set *exceptfds, struct timeval *timeout);
       功能:
         select监听文件描述符集合中是否有文件描述编程ready状态
       功能:
         nfds:最大文件描述符的值+1 
         readfds:读文件描述符集合
         writefds:写文件描述符集合
         exceptfds:其余文件描述符集合
         timeout:等待的时长
             NULL 一直等待
       返回值:
         成功返回文件描述符集合中的文件描述符个数
         失败返回-1 
     void FD_CLR(int fd, fd_set *set);
     功能:
         将文件描述符fd从集合中清除 
     int  FD_ISSET(int fd, fd_set *set);
     功能:
         判断文件描述符fd是否仍在集合中 
     void FD_SET(int fd, fd_set *set);
     功能:
         将文件描述符fd加入到集合中
     void FD_ZERO(fd_set *set);
     功能:
         将文件描述符集合清0    
4..poll  
       int poll(struct pollfd *fds, nfds_t nfds, int timeout);
       功能:
         监听文件描述符集合是否有事件发生
       参数:
         fds:监听文件描述符集合数组空间首地址
         nfds:监听文件描述符集合元素个数
         timeout:等待的时间(-1 一直等待)
       返回值:
         成功返回产生事件的文件描述符个数
         失败返回-1 
     struct pollfd {
         int   fd;         /* file descriptor */
         short events;     /* requested events */
         short revents;    /* returned events */
     };
     fd:监听的文件描述符
     events:要监听的事件  POLLIN:是否可读  POLLOUT:是否可写
     revents:实际产生的事件 
  3.epoll 
       int epoll_create(int size);
       功能:
         创建一张内核事件表
       参数:
         size:事件的个数
       返回值:
         成功返回文件描述符
         失败返回-1 
     
       epoll_ctl 
       int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
       功能:
         维护epoll时间表
       参数:
         epfd:事件表的文件描述符
         op:
             EPOLL_CTL_ADD   添加事件
             EPOLL_CTL_MOD   修改事件
             EPOLL_CTL_DEL   删除事件
         fd:
             操作的文件描述符
         event:
             事件对应的事件 
         
         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 */
         };
       返回值:
         成功返回0 
         失败返回-1 
       epoll_wait 
       int epoll_wait(int epfd, struct epoll_event *events,
                       int maxevents, int timeout);
       功能:
         监听事件表中的事件
       参数:
         epfd:文件描述符
         events:存放实
今日错误:read有东西时才不会阻塞