Linux网络编程poll模型
来源:互联网 发布:mac little snitch 编辑:程序博客网 时间:2024/06/06 03:39
-
-
-
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/poll.h>
- #include <errno.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include <stdlib.h>
-
- #define LISTENQ 5
- #define OPEN_MAX 1024
- #define SERV_PORT 10088
- #define MAX_LINE 1024
- #define INFTIM -1
-
- int main(int argc, char** argv)
- {
- int err, maxpoll, nreadly;
- struct pollfd client[OPEN_MAX];
- struct sockaddr_in cliaddr, servaddr;
- int listenFd = socket(AF_INET, SOCK_STREAM, 0);
- if( listenFd < 0)
- {
- printf("socket函数执行失败");
- return 1;
- }
-
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
-
-
- servaddr.sin_port = htons(SERV_PORT);
- if(bind(listenFd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
- {
- printf("bind函数执行失败");
- return 1;
- }
-
- if(listen(listenFd, LISTENQ) < 0)
- {
- printf("listen函数执行失败");
- return 1;
- }
-
- client[0].fd = listenFd;
- client[0].events = POLLRDNORM;
- for(int i =1; i < OPEN_MAX; i++)
- {
- client[i].fd = -1;
- }
- maxpoll = 0;
- printf("listen函数执行成功\n");
- while(true)
- {
- socklen_t clilen = sizeof(cliaddr);
- nreadly = poll(client, maxpoll + 1, 1000);
- if(client[0].revents & POLLRDNORM)
- {
- int idx = -1;
- for(int i =1; i < OPEN_MAX; i++)
- {
- if(client[i].fd < 0)
- {
- idx = i;
- break;
- }
- }
- if(idx == -1)
- {
-
- continue;
- }
- int connfd = accept(listenFd, (struct sockaddr*)&cliaddr, &clilen);
- if(connfd < 0)
- {
- printf("accept函数执行失败");
- break;
- }
- printf("Ip: %s 到此一游\n", inet_ntoa(cliaddr.sin_addr));
- client[idx].fd = connfd;
- client[idx].events = POLLRDNORM;
-
- maxpoll = (idx > maxpoll ? idx : maxpoll);
-
- if(--nreadly <= 0)
- {
- continue;
- }
- }
-
- for(int i =1; i < OPEN_MAX; i++)
- {
- int sockfd = client[i].fd;
- if(sockfd < 0)
- {
- continue;
- }
- if(client[i].revents & (POLLRDNORM | POLLERR))
- {
- char line[MAX_LINE];
- int n = read(sockfd, line, sizeof(line));
- if(n < 0)
- {
- if(errno == ECONNRESET)
- {
- close(sockfd);
- client[i].fd = -1;
- printf("异常退出\n");
- }
- else
- {
- printf("网络异常");
- exit(-1);
- }
- }
- else if(n == 0)
- {
- close(sockfd);
- client[i].fd = -1;
- printf("正常退出\n");
- }
- else
- {
- line[n] = 0;
- printf("接收到数据:%s\n", line);
- write(sockfd, line, n);
- }
- if(--nreadly <= 0)
- {
- continue;
- }
- }
- }
- }
- }