test
来源:互联网 发布:编程简单的软件 编辑:程序博客网 时间:2024/06/04 19:37
#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/epoll.h>#include <stdlib.h>#define SIZE 1024void usege(const char * arg){ printf("%s ip port\n",arg);}typedef struct epoll_buff{int fd;char buf [SIZE];} epoll_buf,*epoll_buf_p;epoll_buf_p alloc(int fd){ epoll_buf_p ret =(epoll_buf_p) malloc(sizeof(struct epoll_buff)); if (ret ==NULL) { perror("malloc"); exit(10); } return ret;}int startup(const char * ip,const char * port){ int fd = socket(AF_INET,SOCK_STREAM,0); if(fd<0) { perror("socket"); exit(1); } struct sockaddr_in sock_addr; sock_addr.sin_family=AF_INET; sock_addr.sin_port = htons(atoi(port)); sock_addr.sin_addr.s_addr=inet_addr(ip); socklen_t len=sizeof(sock_addr); if((bind(fd,(struct sockaddr*)&sock_addr,len))<0) { perror("bind"); exit(2); } if(listen(fd,128)<0) { perror("listen"); exit(3); } return fd;}int main(int argv,const char * args[]){ if(argv != 3) { usege(args[0]); exit(4); } int listen_sock=startup(args[1],args[2]); int epfd=epoll_create(256); if(epfd<0) { perror("epoll_create");} struct epoll_event ev; struct epoll_event env[32]; ev.events=EPOLLIN; ev.data.ptr=alloc(listen_sock); if(epoll_ctl(epfd, EPOLL_CTL_ADD,listen_sock,&ev)<0) { perror("epoll_ctl"); exit(5); } while(1) { int timeout = 1000; int reve_n = epoll_wait(epfd,env,sizeof(env)/sizeof(env[0]),timeout); switch (reve_n) { case 0: printf("time out \n"); break; case -1: perror("epoll_wait"); exit(6); default: { int idx=0; for(idx;idx<reve_n;idx++) { epoll_buf_p p=(epoll_buf_p)env[idx].data.ptr; if(p->fd == listen_sock&&env[idx].events==EPOLLIN) { struct sockaddr_in cilent ; socklen_t len=sizeof(cilent); int sock=0; while((sock=accept(listen_sock,(struct sockaddr*)&cilent,&len))>0) { const char * cilent_ip=inet_ntoa(cilent.sin_addr); short int cilent_port=ntohs(cilent.sin_port); printf("cilent connect ip:%s port:%d \n",cilent_ip,cilent_port); } if(sock<0) { perror("accept"); } ev.events=EPOLLIN; ev.data.ptr=alloc(sock); if(epoll_ctl(epfd, EPOLL_CTL_ADD,sock,&ev)<0) { perror("epoll_ctl"); exit(7); } continue; } else if(env[idx].events==EPOLLIN) { int res=read(p->fd,p->buf,SIZE); if(res<0){ perror("read"); exit(8); } else if(res==0) { printf("cilent quit!!\n"); close(p->fd); free(p); epoll_ctl(epfd,EPOLL_CTL_MOD,p->fd,NULL); } else { (p->buf)[res-1]=0; printf("####cilent : %s",p->buf); fflush(stdout); } ev.events=(env[idx]).events|EPOLLOUT; if(epoll_ctl(epfd,EPOLL_CTL_MOD,p->fd,&ev)<0) { perror("epoll_ctl"); exit(9); } } else{ // end read int ret= sprintf(p->buf,"HTTP/1.1 200 OK\r\n Content-Length :%s \r\n\r\n hello world"); write(p->fd,p->buf,ret); } } } break; }// end switch } // end while(1) return 0;}
阅读全文
0 0
- test
- test
- test
- test
- test
- test
- test
- Test
- test
- Test
- test
- test
- test
- test
- test
- test
- test
- Test
- JMeter关联
- 算法导论第16章练习题 16.1-4
- JS中的this对象详解
- 映射与反射
- 欢迎使用CSDN-markdown编辑器
- test
- Mybatis第二次
- ssh: Could not resolve hostname github.com: Name or service not known; fatal: The remote end hung up
- markdown中实现缩进的方法
- 针对MySQL5.5版本用%创建用户后在本地(localhost)无法登录的问题
- ssm 写demo异常记录
- 聚类算法总结
- LeetCode 198. House Robber(必须不连续数组的最大和)
- 剑指offer——字符流中第一个不重复的字符