poll的小实验 实现一个回社服务器
1 #include<stdio.h> 2 #include <sys/time.h> 3 #include <sys/types.h> 4 #include<iostream> 5 #include <unistd.h> 6 #include<sys/socket.h> 7 #include<string.h> 8 #include <arpa/inet.h> 9 #include <poll.h> 10 #include<vector> 11 #include<signal.h> 12 #define PORT 8888 13 using namespace std; 14 15 void singl(int a) 16 { 17 18 } 19 int main() 20 { 21 22 int listenfd, confd; 23 int ready; 24 int i=0; 25 int leng; 26 struct sockaddr_in servaddr; 27 28 int max=0; 29 signal(SIGPIPE, SIG_IGN); 30 listenfd=socket(AF_INET, SOCK_STREAM,0); 31 if(listenfd < 0) 32 { 33 perror("socket"); 34 } 35 36 37 bzero(&servaddr, sizeof(servaddr)); 38 servaddr.sin_family = AF_INET; 39 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 40 servaddr.sin_port = htons(PORT); 41 leng=sizeof(servaddr); 42 if(bind(listenfd,(struct sockaddr *)&servaddr,leng)<0) 43 { 44 perror("bind"); 45 } 46 47 listen(listenfd,20); 48 49 50 vector<struct pollfd> pollfdlist; 51 vector<struct pollfd>::iterator it; 52 struct pollfd fds; 53 54 fds.fd=listenfd; 55 fds.events= POLLIN; 56 pollfdlist.push_back(fds); 57 char buf[12]; 60 61 if(pid==0) 62 { 65 max=1024; 66 while(1) 67 { 68 69 cout<<"child----"<<max<<'\n'; 70 ready=poll(&(*pollfdlist.begin()),pollfdlist.size(),-1); 71 72 if(pollfdlist[0].revents & POLLIN) 73 { 74 max++; 75 confd=accept(listenfd,NULL,NULL); 76 if(confd<0) 77 { 78 perror("confd"); 79 }else 80 { 81 fds.fd=confd; 82 fds.events=POLLIN; 83 fds.revents=0; 84 pollfdlist.push_back(fds); 85 86 } 87 ready--; 88 } 89 90 if(0==ready) 91 { 92 continue; 93 } 94 96 { 97 if(it->revents & POLLIN) 98 { 99 ready--; 100 char str[12]={ 0}; 101 int a=read(it->fd,str,12); 102 if(a==0) 103 { 104 cout<<"close cli\n"; 105 close(it->fd); 106 it=pollfdlist.erase(it); 107 it--; 108 max--; 109 110 continue; 111 112 } 113 114 write(it->fd,"hell",4); 115 116 117 } 118 119 120 121 122 } 123 124 125 126 } 129 130 while(1) 131 { 134 kill(pid,10); 135 pause(); 136 137 } 138 cout<<"parent----"<<max<<'\n'; 139 ready=poll(&(*pollfdlist.begin()),pollfdlist.size(),-1); 129 130 while(1) 131 { 132 if(max==1024) 133 { 134 kill(pid,10); 135 pause(); 136 137 } 138 cout<<"parent----"<<max<<'\n'; 139 ready=poll(&(*pollfdlist.begin()),pollfdlist.size(),-1); 140 141 if(pollfdlist[0].revents & POLLIN) 131 { 132 if(max==1024) 133 { 134 kill(pid,10); 135 pause(); 136 137 } 138 cout<<"parent----"<<max<<'\n'; 139 ready=poll(&(*pollfdlist.begin()),pollfdlist.size(),-1); 140 141 if(pollfdlist[0].revents & POLLIN) 138 cout<<"parent----"<<max<<'\n'; 139 ready=poll(&(*pollfdlist.begin()),pollfdlist.size(),-1); 138 cout<<"parent----"<<max<<'\n'; 141 if(pollfdlist[0].revents & POLLIN) 142 { 143 max++; 144 confd=accept(listenfd,NULL,NULL); 145 if(confd<0) 146 { 147 perror("confd"); 148 }else 149 { 150 fds.fd=confd; 151 fds.events=POLLIN; 152 fds.revents=0; 153 pollfdlist.push_back(fds); 154 155 } 156 ready--; 157 } 158 159 if(0==ready) 160 { 161 continue; 162 } 163 165 { 166 if(it->revents & POLLIN) 167 { 168 ready--; 169 char str[12]={ 0}; 170 int a=read(it->fd,str,12); 171 if(a==0) 172 { 173 cout<<"close cli\n"; 174 close(it->fd); 175 it=pollfdlist.erase(it); 176 it--; 177 max--; 178 179 continue; 180 181 } 182 183 write(it->fd,"hell",4); 184 185 186 } 187 188 189 190 191 } 192 193 194 195 } 196 } 197 198 199 200 }
这个实验的想法:
我首先在一个进程中监听一个端口然后在创建一个子进程实现两个进程共同监听一个端口;
我的目的是让他们做传递当父进程处理的请求达到1024时候通知子进程继续进行请求处理
所以该服务器多同时处理2048个并发请求;
希望给出新的想法及改进;
浙公网安备 33010602011771号