自己写的可以实现文件的下载(必须自己知道文件名),还有很多要优化。
譬如:不能看可以下载的文件,输入错误无法处理,不能处理多个用户,每次只能下载一个结束,服务器没有完成守护进程;没有用函数封装,简化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]=' '; 67 */ 68 send_buf[strlen(send_buf)-1]='