FTP 1.0
2015-06-05 11:55
543 查看
自己写的可以实现文件的下载(必须自己知道文件名),还有很多要优化。
譬如:不能看可以下载的文件,输入错误无法处理,不能处理多个用户,每次只能下载一个结束,服务器没有完成守护进程;没有用函数封装,简化main程序。
高级功能:支持文件夹选择下载,断点续传,尝试用多线程,多进程,线程池处理多个请求。
高级功能:实现文件夹选择下载,断点续传。(目前实现由困难)
譬如:不能看可以下载的文件,输入错误无法处理,不能处理多个用户,每次只能下载一个结束,服务器没有完成守护进程;没有用函数封装,简化main程序。
高级功能:支持文件夹选择下载,断点续传,尝试用多线程,多进程,线程池处理多个请求。
客户端代码: 头文件 #ifndef __CLIENT_COMMON__ #define __CLIENT_COMMON__ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #include<fcntl.h> #define SIZE 1024 #define DOWN_PATH "/home/luolizhi/Downloads" #endif client main #include"client_common.h" int main(int argc, char* argv[]) //serverip port { if(argc != 3) { printf("EXE IP PORT"); exit(1); } //socket int clientfd = socket(AF_INET,SOCK_STREAM,0); if(clientfd == -1) { perror("clientfd"); exit(1); } struct sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr(argv[1]); serveraddr.sin_port = htons(atoi(argv[2])); if(-1 == connect(clientfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr))) { perror("connect"); exit(1); } //send char send_buf[SIZE]=""; fgets(send_buf,sizeof(send_buf),stdin); send(clientfd,send_buf,strlen(send_buf),0); //recv /* char FULL_PATH[SIZE]=""; sprintf(FULL_PATH,"%s/%s",DOWN_PATH,send_buf); FULL_PATH[strlen(FULL_PATH)-1]='\0'; */ send_buf[strlen(send_buf)-1]='\0'; FILE* fp = fopen(send_buf,"w"); char recv_buf[SIZE] = ""; recv(clientfd,recv_buf,sizeof(recv_buf)-1,0); //printf("recv:%s\n",recv_buf); fwrite(recv_buf,1,strlen(recv_buf),fp); fclose(fp); close(clientfd); return 0; }
高级功能:实现文件夹选择下载,断点续传。(目前实现由困难)
服务器端代码: 头文件 #ifndef __SERVER_COMMON__ #define __SERVER_COMMON__ #include<stdio.h> #include<stdlib.h> #include<string.h> //socket #include<sys/types.h> #include<sys/socket.h> //inet #include<netinet/in.h> #include<arpa/inet.h> //FILE #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #define DOWN_PATH "/home/luolizhi/Downloads" #define SIZE 1024 void recvn(int sfd,int len); void sendn(int sfd,int len); #endif main 程序 #include"server_common.h" int main(int argc, char* argv[]) //ip port { if(argc != 3) { printf("EXE IP PORT\n"); exit(1); } //socket int serverfd = socket(AF_INET,SOCK_STREAM,0); if(serverfd == -1) { perror("socket"); exit(1); } //bind struct sockaddr_in serveraddr; serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr(argv[1]); serveraddr.sin_port = htons(atoi(argv[2])); if(-1 == bind(serverfd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr))) { perror("bind"); exit(1); } //listen if(-1 == listen(serverfd,10)) { perror("listen"); exit(1); } //accept int clientfd; struct sockaddr_in clientaddr; socklen_t clientlen = sizeof(clientaddr); clientfd = accept(serverfd,(struct sockaddr*)&clientaddr,&clientlen); if(clientfd == -1) { perror("accept"); exit(1); } printf("client: ip:%s,port:%d on\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port)); //recv char recv_buf[SIZE] = ""; char FULL_PATH[SIZE] = ""; recv(clientfd,recv_buf,sizeof(recv_buf)-1,0); sprintf(FULL_PATH,"%s/%s",DOWN_PATH,recv_buf); FULL_PATH[strlen(FULL_PATH)-1] = '\0'; printf("download file:%s\n",FULL_PATH); //open file FILE* fp = fopen(FULL_PATH,"r"); if(fp == NULL) { perror("fopen"); exit(1); } //read file char send_buf[SIZE] = ""; size_t readn; readn = fread(send_buf,1,sizeof(send_buf),fp); printf("readn:%d\n",readn); //send size_t sendn; sendn = send(clientfd,send_buf,strlen(send_buf),0); if(sendn == -1) { perror("sendn"); exit(1); } printf("sendn:%d\n",sendn); close(clientfd); close(serverfd); //while(1); return 0; }
相关文章推荐
- php-fpm占用系统资源分析
- 简单的thinkPHP3.2运行实例。
- PHP通过串口发短信
- phpcms手机内容页面添加上一篇和下一篇
- PHP 正则表达式常用函数使用小结
- php环境安装及搭建
- phpstorm
- ThinkPHP实现支付宝接口功能
- Yii2 Model的一些常用rules规则
- thinkphp
- yii2.0 ajax无法提交问题
- 如何学习PHP的菊花宝典
- PHP 正则表达式
- php 汉字转拼音 [包含20902个基本汉字+5059生僻字]
- php 汉字转拼音 [包含20902个基本汉字+5059生僻字]
- php parallel
- php中的传值赋值,引用赋值
- php比较相似字符串的方法
- 浅谈PHP接收POST数据方式
- php中把“2011-03-17 23:59:00”格式的字符串转化为UNIX 时间戳