网络编程五种IO模型之poll模型
生活随笔
收集整理的這篇文章主要介紹了
网络编程五种IO模型之poll模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
// poll_impl.cpp : 定義控制臺應用程序的入口點。
//#include "stdafx.h"#include <unistd.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>#include <poll.h> /* poll function */
#include <limits.h>#define MAXLINE 10240#ifndef OPEN_MAX
#define OPEN_MAX 40960
#endifvoid handle(struct pollfd* clients, int maxClient, int readyClient);int main(int argc, char **argv)
{int servPort = 6888;int listenq = 1024;int listenfd, connfd;struct pollfd clients[OPEN_MAX];int maxi;socklen_t socklen = sizeof(struct sockaddr_in);struct sockaddr_in cliaddr, servaddr;char buf[MAXLINE];int nready;bzero(&servaddr, socklen);servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(servPort);listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd < 0) {perror("socket error");}int opt = 1;if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {perror("setsockopt error");}if(bind(listenfd, (struct sockaddr *) &servaddr, socklen) == -1) {perror("bind error");exit(-1);}if (listen(listenfd, listenq) < 0) {perror("listen error"); }clients[0].fd = listenfd;clients[0].events = POLLIN;int i;for (i = 1; i< OPEN_MAX; i++) clients[i].fd = -1; maxi = listenfd + 1;printf("pollechoserver startup, listen on port:%d\n", servPort);printf("max connection is %d\n", OPEN_MAX);for ( ; ; ) {nready = poll(clients, maxi + 1, -1);//printf("nready is %d\n", nready);if (nready == -1) {perror("poll error");}if (clients[0].revents & POLLIN) {connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &socklen);sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);printf(buf, "");for (i = 0; i < OPEN_MAX; i++) {if (clients[i].fd == -1) {clients[i].fd = connfd;clients[i].events = POLLIN;break;}}if (i == OPEN_MAX) {fprintf(stderr, "too many connection, more than %d\n", OPEN_MAX);close(connfd);continue;}if (i > maxi)maxi = i;--nready;}handle(clients, maxi, nready);}
}void handle(struct pollfd* clients, int maxClient, int nready) {int connfd;int i, nread;char buf[MAXLINE];if (nready == 0)return;for (i = 1; i< maxClient; i++) {connfd = clients[i].fd;if (connfd == -1) continue;if (clients[i].revents & (POLLIN | POLLERR)) {nread = read(connfd, buf, MAXLINE);//讀取客戶端socket流if (nread < 0) {perror("read error");close(connfd);clients[i].fd = -1;continue;}if (nread == 0) {printf("client close the connection");close(connfd);clients[i].fd = -1;continue;}write(connfd, buf, nread);//響應客戶端 if (--nready <= 0)//沒有連接需要處理,退出循環break;}}
}
總結
以上是生活随笔為你收集整理的网络编程五种IO模型之poll模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络编程五种IO模型之epoll模型
- 下一篇: 网络开源框架之libev使用实例