标签:
自己写的可以实现文件的下载(必须自己知道文件名),还有很多要优化。
譬如:不能看可以下载的文件,输入错误无法处理,不能处理多个用户,每次只能下载一个结束,服务器没有完成守护进程;没有用函数封装,简化main程序。
高级功能:支持文件夹选择下载,断点续传,尝试用多线程,多进程,线程池处理多个请求。
1 客户端代码: 2 头文件 3 #ifndef __CLIENT_COMMON__ 4 #define __CLIENT_COMMON__ 5 6 #include<stdio.h> 7 #include<stdlib.h> 8 #include<string.h> 9 10 #include<sys/types.h> 11 #include<sys/socket.h> 12 13 #include<netinet/in.h> 14 #include<arpa/inet.h> 15 16 #include<unistd.h> 17 #include<fcntl.h> 18 19 #define SIZE 1024 20 #define DOWN_PATH "/home/luolizhi/Downloads" 21 22 23 #endif 24 25 26 client main 27 28 #include"client_common.h" 29 30 int main(int argc, char* argv[]) //serverip port 31 { 32 if(argc != 3) 33 { 34 printf("EXE IP PORT"); 35 exit(1); 36 } 37 38 //socket 39 int clientfd = socket(AF_INET,SOCK_STREAM,0); 40 if(clientfd == -1) 41 { 42 perror("clientfd"); 43 exit(1); 44 } 45 46 struct sockaddr_in serveraddr; 47 serveraddr.sin_family = AF_INET; 48 serveraddr.sin_addr.s_addr = inet_addr(argv[1]); 49 serveraddr.sin_port = htons(atoi(argv[2])); 50 51 if(-1 == connect(clientfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr))) 52 { 53 perror("connect"); 54 exit(1); 55 } 56 57 //send 58 char send_buf[SIZE]=""; 59 fgets(send_buf,sizeof(send_buf),stdin); 60 send(clientfd,send_buf,strlen(send_buf),0); 61 62 //recv 63 /* 64 char FULL_PATH[SIZE]=""; 65 sprintf(FULL_PATH,"%s/%s",DOWN_PATH,send_buf); 66 FULL_PATH[strlen(FULL_PATH)-1]=‘\0‘; 67 */ 68 send_buf[strlen(send_buf)-1]=‘\0‘; 69 FILE* fp = fopen(send_buf,"w"); 70 71 char recv_buf[SIZE] = ""; 72 recv(clientfd,recv_buf,sizeof(recv_buf)-1,0); 73 //printf("recv:%s\n",recv_buf); 74 fwrite(recv_buf,1,strlen(recv_buf),fp); 75 76 fclose(fp); 77 78 79 close(clientfd); 80 81 82 83 84 return 0; 85 }
高级功能:实现文件夹选择下载,断点续传。(目前实现由困难)
1 服务器端代码: 2 3 头文件 4 #ifndef __SERVER_COMMON__ 5 #define __SERVER_COMMON__ 6 7 #include<stdio.h> 8 #include<stdlib.h> 9 #include<string.h> 10 //socket 11 #include<sys/types.h> 12 #include<sys/socket.h> 13 //inet 14 #include<netinet/in.h> 15 #include<arpa/inet.h> 16 //FILE 17 #include<sys/types.h> 18 #include<sys/stat.h> 19 #include<fcntl.h> 20 21 #define DOWN_PATH "/home/luolizhi/Downloads" 22 #define SIZE 1024 23 24 25 void recvn(int sfd,int len); 26 void sendn(int sfd,int len); 27 28 #endif 29 30 31 main 程序 32 #include"server_common.h" 33 34 int main(int argc, char* argv[]) //ip port 35 { 36 if(argc != 3) 37 { 38 printf("EXE IP PORT\n"); 39 exit(1); 40 } 41 //socket 42 int serverfd = socket(AF_INET,SOCK_STREAM,0); 43 if(serverfd == -1) 44 { 45 perror("socket"); 46 exit(1); 47 } 48 49 //bind 50 struct sockaddr_in serveraddr; 51 serveraddr.sin_family = AF_INET; 52 serveraddr.sin_addr.s_addr = inet_addr(argv[1]); 53 serveraddr.sin_port = htons(atoi(argv[2])); 54 55 if(-1 == bind(serverfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr))) 56 { 57 perror("bind"); 58 exit(1); 59 } 60 61 //listen 62 if(-1 == listen(serverfd,10)) 63 { 64 perror("listen"); 65 exit(1); 66 } 67 68 //accept 69 int clientfd; 70 struct sockaddr_in clientaddr; 71 socklen_t clientlen = sizeof(clientaddr); 72 73 clientfd = accept(serverfd,(struct sockaddr*)&clientaddr,&clientlen); 74 if(clientfd == -1) 75 { 76 perror("accept"); 77 exit(1); 78 } 79 80 printf("client: ip:%s,port:%d on\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port)); 81 82 //recv 83 char recv_buf[SIZE] = ""; 84 char FULL_PATH[SIZE] = ""; 85 86 recv(clientfd,recv_buf,sizeof(recv_buf)-1,0); 87 88 sprintf(FULL_PATH,"%s/%s",DOWN_PATH,recv_buf); 89 FULL_PATH[strlen(FULL_PATH)-1] = ‘\0‘; 90 printf("download file:%s\n",FULL_PATH); 91 92 //open file 93 FILE* fp = fopen(FULL_PATH,"r"); 94 if(fp == NULL) 95 { 96 perror("fopen"); 97 exit(1); 98 } 99 100 //read file 101 char send_buf[SIZE] = ""; 102 size_t readn; 103 readn = fread(send_buf,1,sizeof(send_buf),fp); 104 printf("readn:%d\n",readn); 105 106 //send 107 size_t sendn; 108 sendn = send(clientfd,send_buf,strlen(send_buf),0); 109 if(sendn == -1) 110 { 111 perror("sendn"); 112 exit(1); 113 } 114 115 printf("sendn:%d\n",sendn); 116 117 close(clientfd); 118 close(serverfd); 119 120 //while(1); 121 return 0; 122 }
标签:
原文地址:http://www.cnblogs.com/luolizhi/p/4554274.html