第二十七上传下载和并发服务器

  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 <signal.h>
 11 #include <stdlib.h>
 12 #include <sys/wait.h>
 13 #include <pthread.h>
 14 void* zi(void *hh);
 15 void* fu(void* dd);
 16 typedef struct qq
 17 {
 18     int newsfd;
 19     struct sockaddr_in cin;
 20 }pp;
 21 void hh()
 22 {
 23     pid_t res;
 24     while(1)
 25     {
 26         res=waitpid(-1,NULL,0);
 27         if(res<0)
 28         {
 29             break;
 30         }
 31 
 32     }
 33     return;
 34 
 35 }
 36 void* zi(void *hh)
 37 {
 38     struct qq *jj=(struct qq*)hh;
 39     int newsfd=jj->newsfd;
 40     struct sockaddr_in cin=jj->cin;
 41     printf("客户端上线[%s %d]>>\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
 42     while(1)
 43     {
 44         char pop[128];
 45         ssize_t res;
 46         char pp[128];
 47         bzero(pop,sizeof(pop));
 48         res=recv(*((int*)hh),pop,sizeof(pop),0);
 49         if(res<0)
 50         {
 51             printf("接受是失败\n");
 52             break;
 53         }
 54         else if(res==0)
 55         {
 56              printf("客户端下线[%s %d ]>\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
 57             break;
 58 
 59         }
 60         if(strcmp(pop,"quit")==0)
 61         {
 62             break;
 63         }
 64         printf("%s\n",pop);
 65         char h[128]="******";
 66         char b[128]="******";
 67         strcat(h,pop);
 68         strcat(h,b);
 69         send(jj->newsfd,h,sizeof(h),0);
 70     }
 71     close(*((int*)hh));
 72     return NULL;
 73 }
 74 int main(int argc, const char *argv[])
 75 {
 76     __sighandler_t  pp=signal(17, hh);
 77     //创建套接字socket
 78     int sfd= socket(AF_INET , SOCK_STREAM,0);
 79     if(sfd<0)
 80     {
 81         printf("套接字失败\n");
 82         return -1;
 83     }
 84     printf("套接字创建成功\n");
 85     int reuse = 1;
 86     if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
 87     {
 88         fprintf(stderr, "line:%d  ", __LINE__);
 89         perror("setsockopt");
 90         return -1;
 91 
 92     }
 93     struct sockaddr_in hh;
 94     hh.sin_family = AF_INET;
 95     hh.sin_port = htons(PP);
 96     hh.sin_addr.s_addr=inet_addr(IP);
 97     if(bind(sfd,(struct sockaddr *)&hh,sizeof(hh))<0)
 98     {
 99         printf("绑定失败\n");
100         return -1;
101     }
102 
103     //绑定服务器ip bind
104     if(listen(sfd,128)<0)
105     {
106         printf("监听失败\n");
107         return -1;
108     }
109     struct qq ci;
110     while(1)
111     {
112         struct sockaddr_in uu;
113         socklen_t len=sizeof(uu);
114         int newsfd=accept(sfd,(struct sockaddr*)&uu,&len);
115         if(newsfd<0)
116         {
117             printf("失败\n");
118             break;
119         }
120         ci.newsfd=newsfd;
121         ci.cin=uu;
122         pthread_t kkk;
123         int ji=pthread_create(&kkk,NULL,&zi,(void*)&ci);
124         pthread_detach(kkk);
125     }
126     close(sfd);
127 //获取链接的套接字accept
128 //接受客户端信息
129 //发送客户端信息
130 return 0;
131 }                                                                                                                                                     

运行效果

  1 #include <stdio.h>
  2 #include  <sys/types.h>
  3 #include <sys/socket.h>
  4 #include <sys/socket.h>
  5 #include <netinet/in.h>
  6 #include <netinet/ip.h>
  7 #include <string.h>
  8 #include <sys/socket.h>
  9 #include <netinet/in.h>
 10 #include <arpa/inet.h>
 11 #include <string.h>
 12 #include <sys/types.h>
 13 #include <sys/stat.h>
 14 #include <fcntl.h>
 15 #include <unistd.h>
 16 int  do_shang(int pf,struct sockaddr_in fa );
 17 #define POSR 69
 18 #define IP "192.168.124.30"
 19 int  do_down(int pf,struct sockaddr_in fa ) ;
 20 int main(int argc, const char *argv[])
 21 {
 22     int pf= socket(AF_INET,SOCK_DGRAM ,0);
 23     if(pf<0)
 24     {
 25         printf("套接字失败\n");
 26         return -1;
 27     }
 28     printf("套接字成工\n");
 29     struct sockaddr_in fa;
 30     fa.sin_family=AF_INET;
 31     fa.sin_port=htons(POSR);
 32     fa.sin_addr.s_addr=inet_addr(IP);
 33     char buf[128]="";
 34     socklen_t oo=sizeof(fa);
 35     while(1)
 36     {
 37         int a=0;
 38         int  temp;
 39         printf("--------------------\n");
 40         printf("-------2上传--------\n");
 41         printf("-------1下载--------\n");
 42         printf("-------3退出--------\n");
 43         printf("请输入你的选择>>");
 44         scanf("%d",&temp);
 45         while(getchar()!='\n');
 46         switch(temp)
 47         {
 48         case 1:
 49             do_down(pf,fa);
 50             break;
 51         case 2:
 52             do_shang(pf,fa);
 53             break;
 54         case 3:
 55             a=1;
 56             break;
 57 
 58         }
 59         if(a==1)
 60         {
 61             break;                                                                                                    
 62 
 63         }
 64     }
 65 
 66     return 0;
 67 }
 68 int  do_down(int pf,struct sockaddr_in fa )
 69 {
 70     char name[28];
 71     fprintf(stderr,"请输入文件名>>");
 72     scanf("%s",name);
 73     getchar();
 74     //打包请求
 75     //-----------请求包---------------//
 76     char fabao[516]="";
 77     short* r=(short*)fabao;
 78     //读的形式,下载
 79     *r=htons(1);
 80     char * name1=(char*)(r+1);
 81     strcpy(name1,name);
 82     //模式
 83     char* mode=name1+strlen(name1)+1;
 84     strcpy(mode,"octet");//数据打包完成
 85     //-------------------------------//
 86     //------------数据包-------------//
 87     char data[516];
 88     //------------------------------//
 89     int res=2+sizeof(name1)+1+sizeof(mode)+1;
 90 
 91     if(sendto(pf,fabao,res,0,(struct sockaddr*)&fa,sizeof(fa))<0)
 92     {
 93         printf("发送失败\n");
 94         return -1;
 95     }
 96 
 97     int fp=open(name, O_RDWR | O_CREAT | O_TRUNC ,0777);
 98     struct sockaddr_in temp;
 99     char linshi[516];
100     socklen_t len=sizeof(temp);
101     //--------应答包----------------//
102     char huia[4];
103     short *hh=(short*)huia;
104     *hh=htons(4);
105     short* qw=hh+1;
106     *qw=*((short*)(data+2));
107     //-----------------------------//
108     int count=0;
109     while(1)
110     {
111         bzero(data,sizeof(data));
112         short*io=(short*)huia;
113         ssize_t res=recvfrom(pf, data, sizeof(data), 0,(struct sockaddr *)&temp,&len);
114         char *kl=data+4;
115         ssize_t re=write(fp,kl,res-4);
116         short* qw=io+1;
117         *qw=*((short*)(data+2));
118 
119         sendto(pf,huia,sizeof(huia),0,(struct sockaddr*)&temp,sizeof(temp));
120         if(res<516)
121         {
122             printf("退出\n");
123             break;
124 
125         }
126     }
127 }
128 int  do_shang(int pf,struct sockaddr_in fa )
129 {
130     struct sockaddr_in fa1=fa;
131     char name[28];
132     fprintf(stderr,"请输入文件名>>");
133     scanf("%s",name);
134     getchar();
135     //打包请求
136     //-----------请求包---------------//
137     char fabao[516]="";
138     short* r=(short*)fabao;
139     //读的形式,下载
140     *r=htons(2);
141     char * name1=(char*)(r+1);
142     strcpy(name1,name);
143     char* mode=name1+strlen(name1)+1;
144 
145     strcpy(mode,"octet");
146     //----------数据包------------//
147     char date[516];
148     short *ui=(short*)date;
149     //-----------------------------//
150     int ppf=open(name,O_RDONLY);
151     if(ppf<0)
152     {
153         printf("文件打开失败\n");
154         return -1;
155     }
156     int i=0;
157     //------------确认包-------------//
158     char qu[4]="";
159     //------------端口信息-----------//
160     socklen_t len=sizeof(fa1);
161     //-------------------------------//
162     //------------发送信息----------//
163     int res=2+sizeof(name1)+1+sizeof(mode)+1;
164     sendto(pf,fabao,res,0,(struct sockaddr*)&fa,sizeof(fa));
165     recvfrom(pf,qu,sizeof(qu),0,(struct sockaddr* )&fa1,&len);
166 
167     while(1)
168     {
169 
170         *ui=htons(3);
171         short*mok=ui+1;
172         *mok=htons(i);
173         //----数据打包-------//
174         ssize_t res=read(ppf,date+4,512);
175         printf("接受的快编码;%d\n",ntohs(*((short*)(qu))));
176         printf("接受的快编码;%d\n",ntohs(*((short*)(qu+2))));
177         sendto(pf,date,res+4,0,(struct sockaddr*)&fa1,sizeof(fa1));
178         if(res<512)
179         {
180             break;
181 
182 
183         }
184         recvfrom(pf,qu,sizeof(qu),0,(struct sockaddr* )&fa1,&len);
185         //-------教研ack--------//
186         if(ntohs(*((short*)(qu+2)))!=i)
187         {
188             printf("发错\n");
189         }
190         i++;
191 
192     }
193 
194 
195 }

 运行效果上传;

 下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值