第二十八次作业服务器,poll

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/socket.h>
  4 #include <arpa/inet.h>
  5 #include <netinet/in.h>
  6 #include <string.h>
  7 #include <unistd.h>
  8 #define PP 8888
  9 #define IP "192.168.124.10"
 10 #include <sys/time.h>
 11 #include <sys/types.h>
 12 #include <unistd.h>
 13 #include <sys/select.h>
 14 int  kehu(int sfd,struct sockaddr_in xinxi[],fd_set *readfes,int *max);
 15 int  jp(struct sockaddr_in xinxi[],fd_set readfes);
 16 void shuju(int i,struct sockaddr_in *xinxi,int *max,fd_set *readfes);
 17 int main(int argc, const char *argv[])
 18 {
 19     //创建套接字socket
 20     int sfd= socket(AF_INET , SOCK_STREAM,0);
 21     if(sfd<0)
 22     {
 23         printf("套接字失败\n");
 24         return -1;
 25     }
 26     printf("套接字创建成功\n");
 27     int reuse = 1;
 28     if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
 29     {
 30         fprintf(stderr, "line:%d  ", __LINE__);
 31         perror("setsockopt");
 32         return -1;
 33 
 34     }
 35     struct sockaddr_in hh;
 36     hh.sin_family = AF_INET;
 37     hh.sin_port = htons(PP);
 38     hh.sin_addr.s_addr=inet_addr(IP);
 39     if(bind(sfd,(struct sockaddr *)&hh,sizeof(hh))<0)
 40     {
 41         printf("绑定失败\n");
 42         return -1;
 43     }
 44 
 45     //绑定服务器ip bind
 46     if(listen(sfd,128)<0)
 47     {
 48         printf("监听失败\n");
 49         return -1;
 50     }
 51     struct sockaddr_in uu;
 52     struct sockaddr_in xinxi[1024];
 53     socklen_t len=sizeof(uu);
 54 
 55     //-----------------创建集合--------------//
 56     int nfds=sfd+1;
 57     fd_set readfes,temp;
 58     FD_ZERO(&readfes);//清空集合
 59     //---------------加入集合----------------//
 60     FD_SET(sfd, &readfes);
 61     FD_SET(0, &readfes);
 62     char pop[128];
 63     ssize_t res;
 64     char pp[128];
 65     int max=sfd;
 66     int newsfd=1234567;
 67     while(1)
 68     {
 69         temp=readfes;
 70 
 71         int rr=select(max+1,&temp,NULL,NULL,NULL);
 72         if(rr<0)
 73         {
 74             printf("等待失败\n");
 75             return -1;
 76         }
 77         for(int i=0;i<=max;i++)
 78         {
 79             if(FD_ISSET(i,&temp)==0)
 80                 continue;
 81             if(i==0)
 82             {
 83                 jp(xinxi,readfes);
 84 
 85 
 86             }
 87             else if(i==sfd)
 88             {
 89                 kehu(sfd,xinxi,&readfes,&max);
 90             }
 91             else
 92             {
 93                 shuju(i,xinxi,&max,&readfes);
 94             }
 95         }
 96 
 97     }
 98     //获取链接的套接字accept
 99     //接受客户端信息
100     //发送客户端信息
101     return 0;
102 }
103 /*
104  * function:    键盘事件
105  * @param [ in] 
106  * @param [out] 
107  * @return      
108  */
109 int  jp(struct sockaddr_in xinxi[],fd_set readfes)
110 {
111     int ffp;
112     char buf[128];
113     ssize_t res=scanf("%d %s",&ffp,buf);
114     while(getchar()!='\n');
115     if(res!=2)
116     {
117         printf("输入有误请重新输入\n");
118         return -1;
119 
120     }
121     if(FD_ISSET(ffp,&readfes)!=1)                                                                                                
122     {
123         printf("文件描述符不对\n");
124         return -1;
125 
126     }
127     send(ffp,buf,sizeof(buf),0);
128     printf("客户端[%s %d nfd=%d]发送成功\n",inet_ntoa(xinxi[ffp-3].sin_addr),htons(xinxi[ffp-3].sin_port),ffp);
129     return 0;
130 }
131 /*
132  * function:    客户端事件
133  * @param [ in] 
134  * @param [out] 
135  * @return      
136  */
137 int  kehu(int sfd,struct sockaddr_in xinxi[],fd_set *readfes,int *max)
138 {
139     struct sockaddr_in uu;
140     socklen_t len =sizeof(uu);
141     int newsfd=accept(sfd,(struct sockaddr*)&uu,&len);
142     if(newsfd<0)
143     {
144         printf("失败\n");
145         return -1;
146     }
147     xinxi[newsfd-3]=uu;
148     printf("客户端[%s %d]上线 nfd=%d\n",inet_ntoa(xinxi[newsfd-3].sin_addr),htons(xinxi[newsfd-3].sin_port),newsfd);
149 
150     FD_SET(newsfd,readfes);
151     *max=newsfd>(*max) ? newsfd:*max;
152     return -1;
153 
154 }
155 /*
156  * function:    数据段
157  * @param [ in] 
158  * @param [out] 
159  * @return      
160  */
161 void shuju(int i,struct sockaddr_in *xinxi,int *max,fd_set *readfes)
162 {
163 
164     char bf[128];
165     bzero(bf,sizeof(bf));
166     ssize_t fanhui=recv(i,bf,sizeof(bf),0);
167     if(fanhui==0)
168     {
169         printf("客户端[%s %d]下线 nfd=%d\n",inet_ntoa(xinxi[i-3].sin_addr),htons(xinxi[i-3].sin_port),i);
170         close(i);
171         FD_CLR(i,readfes);
172         for(;*max>0;*max--)
173         {
174             if(FD_ISSET(*max,readfes))
175             {
176                 break;
177             }
178         }
179         return ;
180     }
181 
182     printf("客户端[%s %d] nfd=%d >>%s\n",inet_ntoa(xinxi[i-3].sin_addr),htons(xinxi[i-3].sin_port),i,bf);
183     char kk[]="-----";
184     strcat(bf,kk);
185     send(i,bf,sizeof(bf),0);
186     return ;
187 }
~                                                                                                                                    
~                                                                                                                                    

客户端

 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <string.h>
 #include <unistd.h>
 #define PP 8888
 #define IP "192.168.124.10"
 #include <sys/time.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/select.h>
 #define _GNU_SOURCE
 #include <signal.h>
 #include <poll.h>
 
 int main(int argc, const char *argv[])
 {
     //创建套接字socket
     int sfd= socket(AF_INET , SOCK_STREAM,0);
     if(sfd<0)
     {
         printf("套接字失败\n");
         return -1;
     }
     printf("套接字创建成功\n");
     struct sockaddr_in hh;
     hh.sin_family = AF_INET;
     hh.sin_port = htons(PP);
     hh.sin_addr.s_addr=inet_addr(IP);
     socklen_t len=sizeof(hh);
     if(connect(sfd,(struct sockaddr *)&hh,len)<0)
     {
         printf("链接失败\n");
         return -1;
 
     }
     printf("%d\n",sfd);
     //----创建监听集合-----//
     struct pollfd pol[2];
     pol[0].fd=0;
     pol[0].events=POLLIN;
 
     pol[1].fd=sfd;
     pol[1].events=POLLIN;                                         
     char buf[128];
     int res;
     while(1)
     {
          res=poll(pol, 2,-1);
         if(res<0)
         {
             printf("监听失败\n");
             return -1;
         }
         //说明有键盘事件触发//
         if((pol[0].revents&POLLIN)!=0)
         {
             bzero(buf,sizeof(buf));
             scanf("%s",buf);
             send(sfd,buf,sizeof(buf),0);
         }
         if((pol[1].revents&POLLIN)!=0)
         {
             bzero(buf,sizeof(buf));
             ssize_t res;
             res=recv(sfd,buf,sizeof(buf),0);
             if(res==0)
             {
                 printf("服务器下线\n");
 
             }
             printf("%s\n",buf);
         }
 
 
     }
 
     //发送客户端信息
     return 0;
 }
                                                                   
                                                                   
                                                                   
                                                                   
                                                                   

运行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值