C-socket编-epoll()模型
2017-04-10 10:42
134 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/epoll.h> #include <errno.h> #include <ctype.h> #include "wrap.h" #define SERV_PORT 8888 #define MAX_LINE 1024 int main() { int epfd,listenfd,connfd,sockfd; int i,j,n,nready; char buf[MAX_LINE], str[INET_ADDRSTRLEN]; struct sockaddr_in clieaddr, servaddr; socklen_t clielen; epfd=epoll_create(MAX_LINE); /*创建epoll根节点*/ 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,MAX_LINE); struct epoll_event evt,en[MAX_LINE]; evt.events=EPOLLIN; evt.data.fd=listenfd; epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd,&evt); while(1) { nready=epoll_wait(epfd,en,MAX_LINE,-1); for(i=0;i<nready;i++) { if(!(en[i].events & EPOLLIN)) continue; if(en[i].data.fd == listenfd) { clielen=sizeof(clieaddr connfd=Accept(listenfd,(struct sockaddr *)&clieaddr, &clielen ); evt.data.fd=connfd; epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&evt); printf("received from %s at port %d \n", inet_ntop(AF_INET, &clieaddr.sin_addr,str,sizeof(str)), ntohs(clieaddr.sin_port)); } else { sockfd=en[i].data.fd; n=read(sockfd,buf,MAX_LINE); if(n==0) {/*剔除并关闭文件描述符*/ epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL); close(sockfd); printf("client[%d] closed connection\n",sockfd); } else if(n<0) { perror("read n < 0 error"); epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL); close(sockfd); } else { printf("n=%d\n",n); for(j=0; j<n ; j++) buf[j]=toupper(buf[j]); sleep(1); printf("buf=%s",buf); write(sockfd,buf,n); } } } } return 0; }
相关文章推荐
- socket epoll 模型
- socket编程 -- epoll模型服务端/客户端通信的实现
- socket编程 -- epoll模型服务端/客户端通信的实现
- Linux网络服务器epoll模型的socket通讯的实现(一)
- (OK) Linux epoll模型—socket epoll server client chat
- (OK) Linux epoll模型—socket epoll server client chat—pthread
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信EPoll模型(多路复用), 实用Socket通信模板
- (OK) Linux epoll模型—socket epoll server client chat
- python实现select和epoll模型socket网络编程
- (OK) Linux epoll模型—socket epoll server client chat
- python实现select和epoll模型socket网络编程 推荐
- (OK) Linux epoll模型—socket epoll server client chat—pthread
- socket模型之select与epoll
- socket通信网络模型 ——Epoll、IOCP模型详解以及与select、kqueue等常见模型的区别特点
- C-socket编-epoll反应堆模型
- Socket拉屎模型之epoll
- socket编程 -- epoll模型服务端/客户端通信的实现
- Linux Socket 事件触发模型 epoll 示例 这里会写一个用C语言的TCP服务器的完全实现的简单程序
- socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较
- select,poll,epoll 三种socket IO模型