上一节,学习了select模型的实现方式,本节学习poll是否方式,为接下来学习epoll模型作准备。很显然epoll是对poll方式的改进,先看poll是如何工作的。
- /* include fig01 */
- #include "unp.h"
- #include <limits.h> /* for OPEN_MAX */
- int
- main(int argc, char **argv)
- {
- int i, maxi, listenfd, connfd, sockfd;
- int nready;
- ssize_t n;
- char buf[MAXLINE];
- socklen_t clilen;
- struct pollfd client[OPEN_MAX];
- struct sockaddr_in cliaddr, servaddr;
- listenfd = Socket(AF_INET, SOCK_STREAM, 0);
- 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, (SA *) &servaddr, sizeof(servaddr));
- Listen(listenfd, LISTENQ);
- client[0].fd = listenfd;
- client[0].events = POLLRDNORM; //监听读事件
- for (i = 1; i < OPEN_MAX; i++)
- client[i].fd = -1; /* -1 indicates available entry */
- maxi = 0; /* max index into client[] array */
- /* end fig01 */
- /* include fig02 */
- for ( ; ; ) {
- nready = Poll(client, maxi+1, INFTIM);
- if (client[0].revents & POLLRDNORM) { /* 新的连接到来 */
- clilen = sizeof(cliaddr);
- connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);
- #ifdef NOTDEF
- printf("new client: %s\n", Sock_ntop((SA *) &cliaddr, clilen));
- #endif
- for (i = 1; i < OPEN_MAX; i++)
- if (client[i].fd < 0) {
- client[i].fd = connfd; /* 保存描述符到client数组中 */
- break;
- }
- if (i == OPEN_MAX)
- err_quit("too many clients");
- client[i].events = POLLRDNORM; //设置为监听读事件
- if (i > maxi)
- maxi = i; /* max index in client[] array */
- if (--nready <= 0)
- continue; /* no more readable descriptors */
- }
- for (i = 1; i <= maxi; i++) { /* check all clients for data */
- if ( (sockfd = client[i].fd) < 0)
- continue;
- if (client[i].revents & (POLLRDNORM | POLLERR)) {
- if ( (n = read(sockfd, buf, MAXLINE)) < 0) {
- if (errno == ECONNRESET) {
- /*4connection reset by client */
- #ifdef NOTDEF
- printf("client[%d] aborted connection\n", i);
- #endif
- Close(sockfd);
- client[i].fd = -1;
- } else
- err_sys("read error");
- } else if (n == 0) {
- /*4connection closed by client */
- #ifdef NOTDEF
- printf("client[%d] closed connection\n", i);
- #endif
- Close(sockfd);
- client[i].fd = -1;
- } else
- Writen(sockfd, buf, n);
- if (--nready <= 0)
- break; /* no more readable descriptors */
- }
- }
- }
- }
- /* end fig02 */
阅读(2564) | 评论(0) | 转发(2) |