网络编程 IO模型

1.select搭建客户端

  4 #include <head.h>
  5 #define IP "192.168.122.147"
  6 #define PORT 1024
  7 int main(int argc, const char *argv[])
  8 {
  9     int cfd = socket(AF_INET,SOCK_STREAM,0);
 10     if(cfd < 0)
 11     {
 12         ERR_MSG("socket");
 13         return -1;
 14     }
 15 
 16     int reuse = 1;
 17     if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
 18     {
 19         ERR_MSG("setsockopt");
 20         return -1;
 21     }
 22 
 23     struct sockaddr_in sin;
 24     sin.sin_family = AF_INET;
 25     sin.sin_port = htons(PORT);
 26     sin.sin_addr.s_addr = inet_addr(IP);
 27 
 28     if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
 29     {
 30         ERR_MSG("connect");
 31         return -1;
 32     }
 33     printf("[%s : %d] cfd = %d 服务器连接成功\n",\
 34             inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd);
 35 
 36     int s_res = -1;
 37     char buf[128] = "";
 38     ssize_t res = 0;
 39 
 40     fd_set readfds,tempfds;
 41     FD_ZERO(&readfds);
 42     FD_ZERO(&tempfds);
 43     FD_SET(cfd,&readfds);
 44     FD_SET(0,&readfds);
 45 
 46 
 47     while(1)
 48     {
 49         tempfds = readfds;
 50         s_res = select(cfd+1,&tempfds,NULL,NULL,NULL);
 51         if(s_res < 0)
 52         {
 53             ERR_MSG("select");
 54             return -1;
 55         }
 56         else if(s_res == 0)
 57         {
 58             printf("time out");
 59             break;
 60         }
 61         if(FD_ISSET(0,&tempfds))
 62         {   
 63             printf("向服务器发送数据\n");
 64             bzero(buf,sizeof(buf));
 65             scanf("%d %s",cfd,buf);
 66             while(getchar()!=10);
 67             if(send(cfd,buf,sizeof(buf),0) < 0)
 68             {
 69                 ERR_MSG("send");
 70                 return -1;
 71             } 
 72         }
 73         else if(FD_ISSET(cfd,&tempfds))
 74         {
 75             printf("从服务器接收数据\n");
 76 
 77             bzero(buf,sizeof(buf));
 78             res = recv(cfd,buf,sizeof(buf),0);
 79             if(res < 0)
 80             {
 81                 ERR_MSG("recv");
 82                 return -1;
 83             }
 84             else if(res == 0)
 85             {
 86                 printf("[%s : %d] cfd=%d 服务器断开连接\n",\
 87                         inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd);
 88                 FD_CLR(cfd,&readfds);
 89                 break;
 90             }                           
 91         printf("[%s : %d] cfd=%d %s\n",\
 92                 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd,buf);
 93         }
 94     }                                                                                                                                                                                                                                                                                                         
 95 
 96 close(cfd);
 97 return 0;
 98 }
~                                       

2.poll客户端

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <head.h>
  5 #define IP "192.168.122.147"
  6 #define PORT 1024
  7 int main(int argc, const char *argv[])
  8 {
  9     int cfd = socket(AF_INET,SOCK_STREAM,0);
 10     if(cfd < 0)
 11     {
 12         ERR_MSG("socket");
 13         return -1;
 14     }
 15 
 16     int reuse = 1;
 17     if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)) < 0)
 18     {
 19         ERR_MSG("setsockopt");
 20         return -1;
 21     }
 22 
 23     struct sockaddr_in sin;
 24     sin.sin_family = AF_INET;
 25     sin.sin_port = htons(PORT);
 26     sin.sin_addr.s_addr = inet_addr(IP);
 27 
 28     if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
 29     {
 30         ERR_MSG("connect");
 31         return -1;
 32     }
 33     printf("[%s : %d] cfd = %d 服务器连接成功\n",\
 34             inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd);
 35 
 36     int p_res = -1;
 37     char buf[128] = "";
 38     ssize_t res = 0;
 39 
 40     struct pollfd fds[2];
 41     fds[0].fd = 0;
 42     fds[0].events = POLLIN;
 43     fds[1].fd = cfd;
 44     fds[1].events = POLLIN;
 45 
 46     while(1)
 47     {
 48         p_res = poll(fds,2,-1);
 49         if(p_res < 0)
 50         {
 51             ERR_MSG("select");
 52             return -1;
 53         }
 54         else if(p_res == 0)
 55         {
 56             printf("time out");
 57             break;
 58         }
 59         if((fds[0].revents & POLLIN) != 0)
 60         {
 61             printf("向服务器发送数据\n");
 62             bzero(buf,sizeof(buf));
 63             scanf("%s",buf);
 64             while(getchar()!=10);
 65             if(send(cfd,buf,sizeof(buf),0) < 0)
 66             {
 67                 ERR_MSG("send");
 68                 return -1;
 69             }
 70         }
 71         else if((fds[1].revents & POLLIN) != 0)
 72         {
 73             printf("从服务器接收数据\n");
 74 
 75             bzero(buf,sizeof(buf));
 76             res = recv(cfd,buf,sizeof(buf),0);
 77             if(res < 0)
 78             {
 79                 ERR_MSG("recv");
 80                 return -1;
 81             }
 82             else if(res == 0)
 83             {
 84                 printf("[%s : %d] cfd=%d 服务器断开连接\n",\
 85                         inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd);
 86 
 87                 break;
 88             }
 89         printf("[%s : %d] cfd=%d %s\n",\
 90                 inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),cfd,buf);
 91         }
 92     }
 93 
 94 close(cfd);
 95 return 0;                                                                                                                                                                                                                                                                                                     
 96 }

3.项目上传代码

int sc(int sfd,struct sockaddr_in sin)
157 {
158     char name[20] = "";
159     printf("请输入要上传文件名\n");
160     scanf("%s",name);
161     while(getchar() != 10);
162     char buf[516];
163     unsigned short *p1 = (unsigned short*)buf;
164     *p1 = htons(2);
165     char *p2 = buf+2;
166     strcpy(p2,name);
167     char *p3 = p2+strlen(p2)+1;
168     strcpy(p3,"octet");
169     int len = sizeof(unsigned short)+strlen(p2)+1+strlen(p3)+1;
170 
171     if(sendto(sfd,buf,len,0,\
172                 (struct sockaddr*)&sin,sizeof(sin)) < 0)
173     {
174         ERR_MSG("send");
175         return -1;
176     }
177     printf("发送成功\n");
178     struct sockaddr_in cin;
179     socklen_t addrlen2 = sizeof(cin);
180     unsigned short i = 0;
181     ssize_t res = 0;
182     int fd = -1;
183     while(1)
184     {
185         bzero(buf,sizeof(buf));
186         if(recvfrom(sfd,buf,sizeof(buf),0,\
187                 (struct sockaddr*)&cin,&addrlen2) < 0)
188         {
189             ERR_MSG("recvfrom");
190             return -1;
191         }
192 
193         unsigned short *pb1 = (unsigned short*)buf;
194         unsigned short *pb2 = pb1+1;
195         if(*pb1 == htons(4) && i == ntohs(*pb2))
196         {
197             char *pp = buf+4;
198 
199             if(-1 == fd)
200             {
201                 fd = open(name,O_RDONLY);
202                 if(fd < 0)
203                 {
204                     ERR_MSG("open");
205                     return -1;
206                 }
207             }
208 
209             res = read(fd,pp,sizeof(buf)-4);
210             if(res < 0)
211             {
212                 ERR_MSG("write");
213                 close(fd);
214                 break;
215             }
216             printf("上传成功\n");
217             short *pa1 = (short*)buf;
218             *pa1 = htons(3);
219             short *pa2 = (short*)buf+1;
220             *pa2 = htons(++i);
221             if(sendto(sfd,buf,res+4,0,\
222                         (struct sockaddr*)&cin,addrlen2) < 0)
223             {
224                 ERR_MSG("recvfrom");                                                                                                                                                                                                                                                                          
225                 close(fd);
226                 break;
227             }
228             if(res < 512)
229             {
230                 printf("上传完成\n");
231                 close(fd);
232                 break;
233             }
234         }
235         else if(*pb1 == htons(5))
236         {
237             short *pc1 = pb1+1;
238             char *pc2 = (char*)pb1+4;
239             printf("%d %s\n",ntohs(*pc1),pc2);
240             break;
241         }
242     }
243     close(sfd);
244     return 0;
245 }

4.xmind

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值