云计算百科
云计算领域专业知识百科平台

epoll服务器客户端通信

  1 #include<stdio.h>   2 #include<arpa/inet.h>   3 #include<bits/types.h>   4 #include<stdint.h>   5 #include<sys/types.h>   6 #include<sys/socket.h>   7 #include<errno.h>   8 #include<string.h>   9 #include<stdlib.h>  10 #include<unistd.h>  11 #include <fcntl.h>  12 #include <sys/epoll.h>  13 //接受信息结构体  14 struct trr  15 {  16     int used;  17     char data[4096];  18 };  19 int main(int argc, const char *argv[])  20 {  21     char* p="0.0.0.0";  22     //创建服务器的socket套接字符  23     int sockfd=socket(AF_INET,SOCK_STREAM,0);  24     if(-1==sockfd)  25     {  26         perror("socket");  27         return -1;  28     }  29   30   31     //初始化了一个装有ip和pot的结构体  32     struct sockaddr_in add;  33   34   35     //设定为ipv4;  36     add.sin_family=AF_INET;  37   38   39     //端口号in_port_t  40     while(argc!=2)  41     {  42         printf("输入端口号\\n");  43         close(sockfd);  44         return -1;  45   46     }  47     short  port= atoi(argv[1]);  48     add.sin_port=htons(port);  49   50   51     //ip  52     if(inet_pton(AF_INET,p,&add.sin_addr)<=0)  53     {  54         perror("inet_pton");  55         close(sockfd);  56         return -1;  57     }  58   59   60   61     //将装有ip和port的结构体写入创建的套接字文件  62     //服务器筛选接受信息的ip和端口号  63     if(-1==bind(sockfd,(struct sockaddr *)&add,sizeof(add)))  64     {  65         perror("bind");  66     }  67   68     //  69     if(-1==listen(sockfd,10))  70     {  71         perror("listen");  72         close(sockfd);  73         return -1;  74     }  75   76   77   78     printf("服务器已经启动,等待连接》》》\\n");  79   80     // 创建epoll文件实例  81     int epfd;  82     epfd = epoll_create1 ( EPOLL_CLOEXEC );  83     if( epfd == -1 )  84     {  85         perror("epoll_create");  86         return -1;  87     }  88     //  89     //把服务器的sockfd添加进epoll文件  90   91     struct epoll_event qwe;  92     memset(&qwe,0,sizeof(qwe));  93     qwe.events = EPOLLIN;  94     qwe.data.fd=sockfd;  95     if( -1 == epoll_ctl(epfd,EPOLL_CTL_ADD,sockfd,&qwe))  96     {  97         perror("epoll_ctl");  98         return -1;  99     } 100  101     //定义一个激活数组 102     struct epoll_event ev[20]= {0}; 103  104  105  106     /* 107        int flags = fcntl(client,F_GETFL);  108        flags = flags | O_NONBLOCK; 109        fcntl(client,F_SETFL,flags);*/ 110  111     while(1) 112     { 113         memset(ev,0,sizeof(ev)); 114         //把激活的文件描述符结构体发在ev里 115         int len = epoll_wait(epfd,ev,20,-1); 116         if(-1 == len ) 117         { 118             perror("wpoll_wait"); 119             continue; 120         } 121         for(int i = 0; i <= len-1 ; i++ ) 122         { 123             int temp = ev[i].data.fd; 124             if( temp == sockfd ) 125             { 126  127                 //client 接受连接成功的客户端ip,port 128                 struct sockaddr_in  client_addr={0}; 129                 int len_client_addr =  sizeof(client_addr); 130  131                 int client =0; 132                 client =  accept ( sockfd , (struct sockaddr *)&client_addr , &len_client_addr ); 133                 if(-1==client)  134                 { 135                     perror("accept"); 136                 } 137                 char client_ip [16]=""; 138                 inet_ntop(AF_INET,&client_addr.sin_addr,client_ip,16); 139                 printf("接收到的ip :%s\\n端口号 : %d\\n",client_ip,ntohs(client_addr.sin_port)); 140  141  142                 //把新链接的客户端套接字描述符添加进epfd 143                 memset(&qwe,0,sizeof(qwe)); 144                 qwe.events = EPOLLIN ; 145                 qwe.data.fd= client; 146                 if( -1 == epoll_ctl(epfd,EPOLL_CTL_ADD,client,&qwe)) 147                 {    148                     perror("epoll_ctl111");                                                              149                     continue;  150                 }    151  152  153             } 154             else 155             { 156  157                 char buf[64]=""; 158                 ssize_t rcv=read(temp,buf,63); 159                 if(-1==rcv) 160                 { 161                     perror("read"); 162                 } 163                 else if ( 0 == rcv ) 164                 { 165                     printf("客户关闭了链接\\n"); 166                     if(-1== epoll_ctl( epfd , EPOLL_CTL_DEL, temp, NULL)) 167                     { 168                         perror("epoll_ctl_DEL"); 169                         return -1; 170                     } 171                     continue; 172                 } 173                 else 174                 { 175                     if(strcmp(buf,"exit")==0) 176                     { 177                         printf("客户锻关闭了链接\\n"); 178                         if(-1== epoll_ctl( epfd , EPOLL_CTL_DEL, temp, NULL)) 179                         { 180                             perror("epoll_ctl_DEL"); 181                             return -1; 182                         } 183                         continue; 184                     } 185                     printf("接收到 %ld 字节\\n",strlen(buf)); 186                     printf("收到的消息是  : %s\\n", buf); 187                     printf("是否向客户端返回收到的消息\\n"); 188                     printf("是:1/否:2\\n"); 189                     char cmd; 190                     while(1) 191                     { 192                         scanf("%c",&cmd); 193                         if(cmd == '1') 194                         { 195                             //向客户端返回收到的信息 196                             strcat(buf,"——…——"); 197                             ssize_t snd = send ( temp , buf , strlen(buf) , 0); 198                             if( -1 == snd ) 199                             { 200                                 perror("send"); 201                                 break; 202                             } 203                             break; 204                         } 205                         else if(cmd == '2' ) 206                         {  207                             char fnh='\\0'; 208                             ssize_t snd = send ( temp , &fnh , strlen(buf) , 0); 209                             if( -1 == snd ) 210                             { 211                                 perror("send"); 212                                 break; 213                             } 214                             break; 215  216                         } 217                         else 218                         { 219                             continue; 220                         } 221                     } 222                     memset(buf,0,64); 223                 } 224  225             } 226         } 227  228  229     } 230     close(sockfd); 231  232     return 0; 233 }  

  1 #include<stdio.h>   2 #include<arpa/inet.h>   3 #include<bits/types.h>   4 #include<stdint.h>   5 #include<sys/types.h>   6 #include<sys/socket.h>   7 #include<errno.h>   8 #include<string.h>   9 #include<stdlib.h>  10 #include<unistd.h>  11 #include <sys/epoll.h>  12 //传输的信息结构体  13 struct trr  14 {  15     int used;  16     char data[4096];  17 };  18 int main(int argc, const char *argv[])  19 {  20     //写入目标服务器的ip  21     char* p="192.168.186.130";  22   23   24   25     //创建客户端的socket套接字符  26     int client =socket(AF_INET,SOCK_STREAM,0);  27     if(client==-1)  28     {  29         perror("socket");  30         return -1;  31     }  32   33   34   35     //定义了一个装有ip和pot的结构体  36     struct sockaddr_in add;  37   38     //设定为ipv4;  39     add.sin_family=AF_INET;  40     //端口号in_port_t  41     while(argc!=2){printf("输入端口号\\n");close(client);return -1;}  42     short  port= atoi(argv[1]);  43     add.sin_port=htons(port);  44   45   46   47     //ip  48     if(0>inet_pton(AF_INET,p,&add.sin_addr))  49     {  50         perror("inet_pton");  51         close(client);  52         return -1;  53     }  54   55     //将本客户端和服务器链接  56     if(-1==connect(client,(struct sockaddr*)&add,sizeof(add)))  57     {  58         perror("connect");  59         return -1;  60     }  61     //创建epoll文件实例  62     int epfd;  63     epfd = epoll_create1 ( EPOLL_CLOEXEC );  64     if( epfd == -1 )  65     {  66         perror("epoll_create1");  67         return -1;  68     }  69     //把本客户端的sockfd(client)和输入行缓冲区stdin加入epoll实例  70     struct epoll_event epoll_str;  71     memset(&epoll_str,0,sizeof(epoll_str));  72     epoll_str.events = EPOLLIN;  73     epoll_str.data.fd = client;  74     if ( -1 == epoll_ctl(epfd,EPOLL_CTL_ADD,client,&epoll_str))  75     {  76         perror("epoll_ctl-add");  77         return -1;  78     }  79     struct epoll_event epoll_stdin;  80     memset(&epoll_stdin,0,sizeof(epoll_stdin));  81     epoll_str.events = EPOLLIN;  82     epoll_str.data.fd = 0;  83     if ( -1 == epoll_ctl(epfd,EPOLL_CTL_ADD,0,&epoll_stdin))  84     {  85         perror("epoll_ctl-add");  86         return -1;  87     }  88     //定义一个激活数组  89     struct epoll_event ev[2];  90   91     while(1)  92     {  93         printf("输入传给服务器的信息\\n");  94         char buf[64]="";  95         scanf("%s",buf);  96   97         ssize_t aaa = send(client,buf,strlen(buf),0);  98         if(-1==aaa)  99         { 100             perror("read"); 101         } 102         else if ( 0 == aaa ) 103         { 104             printf("客户关闭了链接\\n"); 105             break; 106         } 107         else 108         { 109             if(strcmp(buf,"exit")==0) 110             { 111                 printf("关闭客户端\\n"); 112                 break; 113             } 114         } 115  116  117  118         memset(ev,0,sizeof(ev)); 119         int len = epoll_wait(epfd, ev, 2, -1); 120         if(-1 == len ) 121         { 122             perror("epoll_wait"); 123             continue; 124         } 125         for(int i = 0; i<len ;i++) 126         {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         127  128             struct epoll_event temp = ev[i]; 129             if (temp.data.fd == client) 130  131             { 132                 memset(buf , 0 ,64); 133                 ssize_t rcv = recv( client , buf ,63 ,0); 134                 if(rcv ==-1) 135                 { 136                     perror("recv"); 137                     continue; 138                 } 139                 if(strlen(buf)==0) 140                 { 141                     printf("服务器未返回信息\\n"); 142                     break; 143                 } 144                 printf("收到服务器返回的信息\\n"); 145                 printf("%s\\n", buf ); 146             } 147         } 148     } 149     return 0; 150 }  

赞(0)
未经允许不得转载:网硕互联帮助中心 » epoll服务器客户端通信
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!