• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我的人生我来写
博客园    首页    新随笔    联系   管理    订阅  订阅

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 }
View Code

这个实验的想法:

    我首先在一个进程中监听一个端口然后在创建一个子进程实现两个进程共同监听一个端口;

           我的目的是让他们做传递当父进程处理的请求达到1024时候通知子进程继续进行请求处理

    所以该服务器多同时处理2048个并发请求;

 

 

希望给出新的想法及改进;

posted @ 2018-11-10 14:58  我的人生我来写  阅读(150)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3