当前位置: 首页 > news >正文

使用Linux实现FTP云盘项目2

实现功能:

ls———查看服务端文件

lls———查看客户端自己的文件

cd———切换服务端目录

lcd———切换客户端自己的目录

切换成功

put———上传文件

get———下载文件

服务器端:

客户端:

源码:

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <limits.h>#define RD_BUFSIZE	1024
#define WR_BUFSIZE	64typedef struct c_msg{int fd;char cip_addr[16];	//ip鍦板潃淇℃伅uint16_t c_port;	//绔彛鍙?}c_msg_t;void choosecmd(char* cmd, c_msg_t* c_msg);void * service_handle(void* arg){char r_buf[RD_BUFSIZE];c_msg_t c_msg = *(c_msg_t *)arg;int ret = -1;pthread_detach(pthread_self());//5.鎺ュ彈鏁版嵁for(;;){memset(r_buf, 0, sizeof(r_buf));ret = read(c_msg.fd, r_buf, sizeof(r_buf));if(ret < -1){pthread_exit(0);}printf("tid: %ld, fd: %d, receive data is: %s\n",pthread_self(), c_msg.fd, r_buf);choosecmd(r_buf, &c_msg);	}close(c_msg.fd);pthread_exit(0);
}//鏈嶅姟鍣ㄧ殑socket
int main(int argc, char* argv[]){//閽堝TCP/IP鐨勭粨鏋勪綋(IP鍦板潃鍜岀鍙e彿鐨勯厤缃?struct sockaddr_in sin;bzero(&sin, sizeof(sin));//1.鍒涘缓绔彛	int s_fd = socket(AF_INET, SOCK_STREAM, 0);if(s_fd < 0){perror("鍒涘缓绔彛澶辫触\n");exit(-1);}//2.閰嶇疆IP鍜岀鍙e彿//struct sockaddr_in {//     sa_family_t    sin_family; /* address family: AF_INET *///     in_port_t      sin_port;   /* port in network byte order *///     struct in_addr sin_addr;   /* internet address *///  };/* Internet address. *///struct in_addr {//   uint32_t       s_addr;     /* address in network byte order */// };sin.sin_family = AF_INET;sin.sin_port = htons(atoi(argv[1]));sin.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(s_fd, (struct sockaddr *)&sin, sizeof(sin)) < 0){perror("缁戝畾绔彛澶辫触\n");close(s_fd);exit(-1);}//3.閰嶇疆鐩戝惉if(listen(s_fd, 5) < 0){perror("璁剧疆鐩戝惉澶辫触\n");exit(-1);}//4.鎺ユ敹璇锋眰骞跺垱寤哄瓙绾跨▼pthread_t tid;struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);c_msg_t c_msg;for(;;){c_msg.fd = accept(s_fd, (struct sockaddr *)&cin, &addrlen);if(c_msg.fd < 0){perror("鎺ュ彈璇锋眰澶辫触\n");exit(-1);}if(!inet_ntop(AF_INET, &cin.sin_addr, c_msg.cip_addr, sizeof(c_msg.cip_addr))){perror("鑾峰彇IP澶辫触\n");exit(-1);}c_msg.c_port = ntohs(cin.sin_port);printf("宸茬粡寤虹珛鍜孖P涓?s,绔彛涓?%d鐨勫鎴风鐨勮繛鎺n", c_msg.cip_addr, c_msg.c_port);pthread_create(&tid, NULL ,service_handle , &c_msg);}close(s_fd);exit(0);
}void choosecmd(char* cmd, c_msg_t* c_msg){int cmd_id = 0;if(strcmp("lls\n", cmd) == 0){cmd_id = 1;}else if(strcmp("quit\n", cmd) == 0){cmd_id = 2;}else if(strstr(cmd, "lcd ")){cmd_id = 4;}else if(strstr(cmd, "get ")){cmd_id = 5;}else if(strstr( cmd, "put ")){cmd_id = 6;}else if(strcmp("lpwd\n", cmd) == 0){cmd_id = 7;}printf("cmd_id = %d\n", cmd_id);char rd_tmp_buf[RD_BUFSIZE];switch(cmd_id){//llscase 1:{int rd_byte;FILE* file = popen("ls", "r");if(file == NULL){printf("open failed!\n");}for(;;){rd_byte = fread(rd_tmp_buf, sizeof(rd_tmp_buf) / 16, 1, file);if(rd_byte < sizeof(rd_tmp_buf) / 16){break;}}write(c_msg->fd, rd_tmp_buf, strlen(rd_tmp_buf));printf("鎺ユ敹鍒?lls鎸囦护, 鏈嶅姟鍣ㄦ枃浠跺凡鍙戦€?...\n");break;}//quitcase 2:{ printf("鏂紑鍜孖P涓?s,绔彛涓?%d鐨勫鎴风鐨勮繛鎺ヤ腑...\n", c_msg->cip_addr, c_msg->c_port);close(c_msg->fd);pthread_exit(0);break;}//lcdcase 4:{char* p = strtok(cmd, " ");p = strtok(NULL, " ");printf("%s\n", p);char cwd[PATH_MAX];if(chdir(p)){char e_msg[200] = "鍒囨崲浜戠洏鐩綍澶辫触锛岃妫€鏌ュ綋鍓嶄簯鐩樼洰褰曟槸鍚﹀瓨鍦? 褰撳墠浜戠洏鐩綍涓?\n";getcwd(cwd, sizeof(cwd));strcat(e_msg, cwd);write(c_msg->fd, e_msg, strlen(e_msg));printf("鍒囨崲浜戠洏鐩綍澶辫触锛岃妫€鏌ュ綋鍓嶇洰褰曟槸鍚﹀瓨鍦╘n");printf("浜戠洏褰撳墠宸ヤ綔鐩綍涓? %s\n", cwd);}else{			char s_msg[64] = "鍒囨崲浜戠洏鐩綍鎴愬姛, 褰撳墠鐩綍涓?";getcwd(cwd, sizeof(cwd));strcat(s_msg, cwd);write(c_msg->fd, s_msg, strlen(s_msg));printf("浜戠洏褰撳墠宸ヤ綔鐩綍涓? %s\n", cwd);}break;}//getcase 5:{char c[8192];char* c_p = c;size_t rd_byte;char* p = strtok(cmd, " ");p = strtok(NULL, " ");printf("%s\n", p);if(access(p, F_OK) == -1){write(c_msg->fd ,"0" ,1);printf("褰撳墠璺緞涓猴紝涓嶅瓨鍦ㄨ鏂囦欢\n");}else{int des_fd = open(p, O_RDONLY);while((rd_byte = read(des_fd, c_p, 128) > 0)){c_p += rd_byte;}			write(c_msg->fd ,c ,sizeof(c));printf("鏂囦欢鍙戦€佹垚鍔?\n");close(des_fd);}break;}//putcase 6:{break;}//lpwdcase 7:{char cwd[PATH_MAX];getcwd(cwd, sizeof(cwd));write(c_msg->fd, cwd, strlen(cwd));printf("浜戠洏褰撳墠鎵€鍦ㄦ枃浠剁郴缁熻矾寰勪负: %s\n", cwd);break;}default:{break;}}}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <limits.h>
#include <sys/stat.h>
#include <fcntl.h>#define RD_BUFSIZE	1024
#define WR_BUFSIZE	64char w_buf[WR_BUFSIZE];
char r_buf[RD_BUFSIZE];void choosecmd(char *cmd, int sockfd);int main(int argc, char* argv[]){if(argc != 2){printf("杈撳叆鍙傛暟鏈夎\n");printf("瀹㈡埛绔垱寤哄叧闂?..\n");exit(-1);}int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("瀹㈡埛绔垱寤虹鍙eけ璐n");exit(-1);}struct sockaddr_in dest_sin;socklen_t dest_s_addr = sizeof(dest_sin);dest_sin.sin_family = AF_INET;dest_sin.sin_port = htons(atoi(argv[1]));dest_sin.sin_addr.s_addr = htonl(INADDR_ANY);if(connect(sockfd,(struct sockaddr *)&dest_sin, dest_s_addr)){perror("杩炴帴鐩爣鏈嶅姟鍣ㄥけ璐n");exit(-1);}printf("杩炴帴鐩爣鏈嶅姟鍣ㄦ垚鍔?..\n");for(;;){memset(w_buf, 0, sizeof(w_buf));while(fgets(w_buf, sizeof(w_buf), stdin) == NULL);write(sockfd, w_buf, strlen(w_buf));choosecmd(w_buf, sockfd);		}
}void choosecmd(char *cmd, int sockfd){int cmd_id = 0;if(strcmp("ls\n", cmd) == 0){cmd_id = 1;}else if(strcmp("lls\n", cmd) == 0){cmd_id = 2;}else if(strcmp("quit\n", cmd) == 0){cmd_id = 3;}else if(strstr(cmd, "lcd ")){cmd_id = 4;}else if(strstr(cmd, "cd ")){cmd_id = 5;}else if(strstr(cmd, "get ")){cmd_id = 6;}else if(strstr(cmd, "put ")){cmd_id = 7;}else if(strcmp(cmd, "pwd\n") == 0){cmd_id = 8;}else if(strcmp(cmd, "lpwd\n") == 0){cmd_id = 9;}printf("cmd_id = %d\n", cmd_id);switch(cmd_id){//lscase 1:{system("ls");//char* arg = "ls";//execl("/bin/ls", arg, NULL);break;}//llscase 2:{memset(r_buf, 0, sizeof(r_buf));			read(sockfd, r_buf, sizeof(r_buf));printf("鏈嶅姟鍣ㄦ枃浠? %s\n", r_buf);break;}//quitcase 3:{printf("閫€鍑?..\n");close(sockfd);exit(1);break;}//lcdcase 4:{char c[200];read(sockfd, c, sizeof(c));printf("%s\n", c);break;}//cdcase 5:{char* p = strtok(cmd, " ");p = strtok(NULL, " ");char cwd[PATH_MAX];if(chdir(p)){printf("鍒囨崲鐩綍澶辫触锛岃妫€鏌ュ綋鍓嶅鎴风鐩綍鏄惁瀛樺湪\n");}getcwd(cwd, sizeof(cwd));printf("瀹㈡埛绔綋鍓嶅伐浣滅洰褰曚负: %s\n", cwd);break;}//getcase 6:{char c[8192];char* c_p = c;size_t rd_byte;char* p = strtok(cmd, " ");p = strtok(NULL, " ");			while((rd_byte = read(sockfd, c_p, 128)) > 0){c_p += rd_byte;}int des_fd = open(p, O_WRONLY | O_CREAT, 0644);//姣忔get閮芥槸閲嶆柊瑕嗗啓鍘熸枃浠?lseek(des_fd, 0, SEEK_SET);write(des_fd, c, sizeof(c));close(des_fd);break;}//putcase 7:{break;}//pwdcase 8:{printf("褰撳墠鏈湴璺緞涓?\n");system("pwd");break;}//lpwdcase 9:{char cwd[PATH_MAX];read(sockfd, cwd, PATH_MAX);printf("褰撳墠浜戠洏璺緞涓?\n%s\n", cwd);break;}default:{printf("璇疯緭鍏ヤ互涓嬫寚浠や箣涓€:\n");printf("-------------------cmd-------------------\n");printf("1.ls	  	: 鏌ョ湅鏈湴鏂囦欢绯荤粺\n");printf("2.lls	  	: 鏌ョ湅浜戠洏鏂囦欢绯荤粺\n");printf("3.cd xx   	: 鍒囨崲鏈湴鏂囦欢璺緞\n");printf("4.lcd xx  	: 鍒囨崲浜戠洏鏂囦欢璺緞\n");printf("5.puts xx 	: 灏嗘枃浠跺瓨鍏ヤ簯鐩榎n");printf("6.gets xx 	: 鑾峰彇浜戠洏鏂囦欢\n");printf("7.pwd 		: 鏌ョ湅鏈湴鏂囦欢绯荤粺璺緞\n");printf("8.lpwd 		: 鏌ョ湅浜戠洏鏂囦欢绯荤粺璺緞\n");break;}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 全栈物联网云平台搭建:MQTT、Node.js、MongoDB、InfluxDB与React的应用示例
  • 数据分析与应用:微信-情人节红包流向探索分析
  • 仅通过 css 为代码添加行号 | code line number with CSS only
  • vxe-table树形结构使用setCheckboxRow卡顿--已解决
  • 1章1节:认识人工智能的第一节课
  • Bash考古以及 StackOverflow的2024年度技术统计报告
  • 深入浅出 Electron 的BrowserWindow
  • 线性表-单链表-C语言实现
  • 【ESP01开发实例】- ISD1820录音控制
  • JDK17下载安装卸载
  • gdb调试core dump快速入门
  • 异或高斯消元模板(板子整理)
  • 【Leetcode 242 】有效的字母异位词——这也太简单了吧
  • .gitignore不生效的解决方案
  • resource not found with Azure OpenAI service
  • CentOS7简单部署NFS
  • Netty源码解析1-Buffer
  • Vue 2.3、2.4 知识点小结
  • VUE es6技巧写法(持续更新中~~~)
  • webpack+react项目初体验——记录我的webpack环境配置
  • 关于for循环的简单归纳
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 后端_MYSQL
  • 盘点那些不知名却常用的 Git 操作
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 深度学习入门:10门免费线上课程推荐
  • 手写双向链表LinkedList的几个常用功能
  • 系统认识JavaScript正则表达式
  • 学习Vue.js的五个小例子
  • 异步
  • 再次简单明了总结flex布局,一看就懂...
  • postgresql行列转换函数
  • ​渐进式Web应用PWA的未来
  • #{} 和 ${}区别
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (初研) Sentence-embedding fine-tune notebook
  • (第一天)包装对象、作用域、创建对象
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一)Java算法:二分查找
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)C#调用WebService 基础
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转载)从 Java 代码到 Java 堆
  • .net mvc 获取url中controller和action
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • /usr/bin/env: node: No such file or directory
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)