社交网站cms,医院网站建设原理,国家最新房地产政策,wordpress社交创建一个epoll句柄#xff0c;参数size用来告诉内核监听的文件描述符的个数#xff0c;跟内存大小有关。 #include sys/epoll.h int epoll_create(int size)   size#xff1a;监听数目     通过创建一个size大小的红黑数来实现epoll句柄#xff0c;返回epfd是该… 创建一个epoll句柄参数size用来告诉内核监听的文件描述符的个数跟内存大小有关。   #include sys/epoll.h   int epoll_create(int size)   size监听数目     通过创建一个size大小的红黑数来实现epoll句柄返回epfd是该树的根节点。   控制某个epoll监控的文件描述符上的事件注册、修改、删除。     #include sys/epoll.h     int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)     epfd 为epoll_creat的句柄     op 表示动作用3个宏来表示       EPOLL_CTL_ADD (注册新的fd到epfd)       EPOLL_CTL_MOD (修改已经注册的fd的监听事件)       EPOLL_CTL_DEL (从epfd删除一个fd)     event 告诉内核需要监听的事件是一个地址   struct epoll_event {     __uint32_t events;      //EPOLLIN  EPOLLOUT  EPOLLERR     epoll_data_t data;    };   typedef union epoll_data {     void *ptr;     int fd;            //相当于函数中使用的fd     uint32_t u32;     uint64_t u64;   } epoll_data_t;   等待所监控文件描述符上有事件的产生类似于select()调用。   #include sys/epoll.h   int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)   events 用来存内核得到事件的集合是一个数组并且是传出参数。   maxevents 告之内核这个events有多大这个maxevents的值不能大于创建epoll_create()时的size   timeout 是超时时间     -1 阻塞     0 立即返回非阻塞     0 指定毫秒   返回值 成功返回有多少文件描述符就绪时间到时返回0出错返回-1   示例  #include stdio.h
#include unistd.h
#include stdlib.h
#include string.h
#include arpa/inet.h
#include sys/epoll.h
#include errno.h
#include ctype.h#include wrap.h#define MAXLINE 8192
#define SERV_PORT 8000
#define OPEN_MAX 5000int main(int argc, char *argv[])
{int i, listenfd, connfd, sockfd;int  n, num  0;ssize_t nready, efd, res;char buf[MAXLINE], str[INET_ADDRSTRLEN];socklen_t clilen;struct sockaddr_in cliaddr, servaddr;struct epoll_event tep, ep[OPEN_MAX];       //tep: epoll_ctl参数  ep[] : epoll_wait参数
listenfd  Socket(AF_INET, SOCK_STREAM, 0);int opt  1;setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, opt, sizeof(opt));      //端口复用
bzero(servaddr, sizeof(servaddr));servaddr.sin_family  AF_INET;servaddr.sin_addr.s_addr  htonl(INADDR_ANY);servaddr.sin_port  htons(SERV_PORT);Bind(listenfd, (struct sockaddr *) servaddr, sizeof(servaddr));Listen(listenfd, 20);efd  epoll_create(OPEN_MAX);               //创建epoll模型, efd指向红黑树根节点if (efd  -1)perr_exit(epoll_create error);tep.events  EPOLLIN; tep.data.fd  listenfd;           //指定lfd的监听时间为读res  epoll_ctl(efd, EPOLL_CTL_ADD, listenfd, tep);    //将lfd及对应的结构体设置到树上,efd可找到该树if (res  -1)perr_exit(epoll_ctl error);for ( ; ; ) {/*epoll为server阻塞监听事件, ep为struct epoll_event类型数组, OPEN_MAX为数组容量, -1表永久阻塞*/nready  epoll_wait(efd, ep, OPEN_MAX, -1); if (nready  -1)perr_exit(epoll_wait error);for (i  0; i  nready; i) {if (!(ep[i].events  EPOLLIN))      //如果不是读事件, 继续循环continue;if (ep[i].data.fd  listenfd) {    //判断满足事件的fd是不是lfd            clilen  sizeof(cliaddr);connfd  Accept(listenfd, (struct sockaddr *)cliaddr, clilen);    //接受链接
printf(received from %s at PORT %d\n, inet_ntop(AF_INET, cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));printf(cfd %d---client %d\n, connfd, num);tep.events  EPOLLIN; tep.data.fd  connfd;res  epoll_ctl(efd, EPOLL_CTL_ADD, connfd, tep);if (res  -1)perr_exit(epoll_ctl error);} else {                                //不是lfd, sockfd  ep[i].data.fd;n  Read(sockfd, buf, MAXLINE);if (n  0) {                       //读到0,说明客户端关闭链接res  epoll_ctl(efd, EPOLL_CTL_DEL, sockfd, NULL);  //将该文件描述符从红黑树摘除if (res  -1)perr_exit(epoll_ctl error);Close(sockfd);                  //关闭与该客户端的链接printf(client[%d] closed connection\n, sockfd);} else if (n  0) {                 //出错perror(read n  0 error: );res  epoll_ctl(efd, EPOLL_CTL_DEL, sockfd, NULL);Close(sockfd);} else {                            //实际读到了字节数for (i  0; i  n; i)buf[i]  toupper(buf[i]);   //转大写,写回给客户端
Write(STDOUT_FILENO, buf, n);Writen(sockfd, buf, n);}}}}Close(listenfd);Close(efd);return 0;
}    转载于:https://www.cnblogs.com/lr1402585172/p/10754937.html