linuxcftp实验报告

上传人:第*** 文档编号:61714592 上传时间:2018-12-10 格式:PDF 页数:23 大小:524.15KB
返回 下载 相关 举报
linuxcftp实验报告_第1页
第1页 / 共23页
linuxcftp实验报告_第2页
第2页 / 共23页
linuxcftp实验报告_第3页
第3页 / 共23页
linuxcftp实验报告_第4页
第4页 / 共23页
linuxcftp实验报告_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《linuxcftp实验报告》由会员分享,可在线阅读,更多相关《linuxcftp实验报告(23页珍藏版)》请在金锄头文库上搜索。

1、嘉应学院计算机学院 LINUX 系统 综合性实验报告 计算机学院实验报告计算机学院实验报告 课程LINUX 系统 实验名称FTP SERVER int clientfd; uint16_t port; int ret; pid_t pid; struct sockaddr_in server_addr; if ( 2 != argc ) printf(“usage: command listen_portn“); return -1; port = atoi(argv1); 服务器端 客户端 嘉应学院计算机学院 LINUX 系统 综合性实验报告 - 5 - server_addr.sin_fa

2、mily =AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(port); sockfd = socket(PF_INET,SOCK_STREAM,0); if (sockfd body_len = ntohl(msg-body_len); msg-command= ntohl(msg-command); /printf(“len = %d, msg = %sn“, msg-body_len, msg-msg_body); 如果服务器出现如果服务器出现 quit 的时候就推出的时候就推

3、出 if ( COMMAND_QUIT = msg-command ) printf(“client closed connection!n“); close(sockfd); return ; 处理下载请求处理下载请求 ret = handle_request(msg, sockfd); if ( SOCK_ERROR = ret ) return; free(msg); 处理客户端的下载处理客户端的下载 int handle_get(msg_head_ctrl_t * msg, int sockfd) 嘉应学院计算机学院 LINUX 系统 综合性实验报告 - 9 - int fd; int

4、 ret; bool exist; uint32_t body_len; msg_head_ctrl_t *ack_msg; ssize_tread_bytes; ssize_tsent_bytes; 检查所需下载的文件所否存在检查所需下载的文件所否存在 exist = file_exist( msg-msg_body ); printf(“%s , %d“, msg-msg_body, exist); if ( false = exist ) printf(“File %s doesnt exist!n“,msg-msg_body); body_len = msg-body_len; msg

5、-body_len = htonl(msg-body_len); msg-command= htonl(COMMAND_NO_FILE); ret = send(sockfd, msg, sizeof(msg_head_ctrl_t) + body_len, 0); if ( ( sizeof(msg_head_ctrl_t) + body_len ) != ret) printf(“send error,%s:%d“,_FUNCTION_, _LINE_); return SOCK_ERROR; return FAILED; 传送下载数据传送下载数据 while(true) read_byt

6、es = read(fd, ack_msg-msg_body, MAX_READ_BYTES); if ( read_bytes 0 ) /printf(“len %d,%dn“, read_bytes, ack_msg-body_len); 嘉应学院计算机学院 LINUX 系统 综合性实验报告 - 10 - ack_msg-body_len = htonl(read_bytes); ack_msg-command= htonl(msg-command); ret = SUCCESSFUL; else if ( -1 = read_bytes ) read_bytes = 0; ack_msg

7、-body_len = 0; ack_msg-command= htonl(COMMAND_ERROR_FILE); ret = FAILED; else if ( 0 = read_bytes )/传送完退出 ack_msg-body_len = 0; ack_msg-command= htonl(COMMAND_END_FILE); ret = SUCCESSFUL; sent_bytes = send( sockfd, ack_msg, read_bytes + sizeof(msg_head_ctrl_t), 0); if ( sent_bytes != (read_bytes + s

8、izeof(msg_head_ctrl_t) ret = SOCK_ERROR; printf(“send data error!%s:%d“,_FUNCTION_, _LINE_); break; if ( 0 = ack_msg-body_len ) break; close(fd); return ret; 处理显示服务端目录内容和打印服务端路径处理显示服务端目录内容和打印服务端路径 int handle_ls_pwd(msg_head_ctrl_t * msg, int sockfd) 嘉应学院计算机学院 LINUX 系统 综合性实验报告 - 11 - FILE *file; msg_

9、head_ctrl_t *ack_msg; size_t read_bytes; size_t ret; printf(“%sn“, msg-msg_body); file = popen( msg-msg_body, “r“); if ( NULL = file ) printf(“execute command failed! %sn“, msg-msg_body); return FAILED; ack_msg = malloc(sizeof(msg_head_ctrl_t) + MAX_READ_BYTES); if ( NULL = ack_msg ) printf(“out of

10、memory!n“); return FAILED; ack_msg-command = htonl( msg-command ); while(true) read_bytes = fread(ack_msg-msg_body,1, MAX_READ_BYTES, file); if ( ferror(file) break; ack_msg-body_len = htonl(read_bytes); ret = send(sockfd, ack_msg, read_bytes+sizeof(msg_head_ctrl_t), 0); if ( (read_bytes+sizeof(msg_

11、head_ctrl_t) != ret ) printf(“sock error!n“); return SOCK_ERROR; if ( feof(file ) ) printf(“send over!n“); 嘉应学院计算机学院 LINUX 系统 综合性实验报告 - 12 - break; pclose(file); 处理服务器的请求处理服务器的请求 int handle_request( msg_head_ctrl_t * msg, int sockfd) char *cmd; int ret; switch(msg-command) case COMMAND_CD:/处理 cd 命令

12、cmd = trim_all_space( msg-msg_body+2);/skip “cd“ charatcer ret = chdir(cmd); if ( -1 = ret ) printf(“%s, |%s|n“, strerror(errno), cmd); break; case COMMAND_LS: case COMMAND_PWD: ret = handle_ls_pwd(msg, sockfd); break; case COMMAND_GET: ret = handle_get(msg, sockfd); break; case COMMAND_PUT: break;

13、default: ret = FAILED; break; 嘉应学院计算机学院 LINUX 系统 综合性实验报告 - 13 - return ret; 4.2.2、实现客户端功能的主要代码编写: 建立套接字建立套接字 sockfd = socket(PF_INET, SOCK_STREAM , 0); if(sockfd body_len = ntohl(msg-body_len); msg-command= ntohl(msg-command); if(COMMAND_LS=msg-command)| (COMMAND_PWD=msg-command) ) printf(“n%sn“,msg

14、-msg_body); 嘉应学院计算机学院 LINUX 系统 综合性实验报告 - 15 - else if ( COMMAND_GET = msg-command ) save_file_to_disk(msg-msg_body); free(msg); 把命令传送到服务端把命令传送到服务端 int send_command_to_server( int sockfd, char *user_input, command_type_t type) ssize_t ret; msg_head_ctrl_t *msg; int body_len; int total_len; body_len =

15、 strlen(user_input); total_len = body_len + sizeof(msg_head_ctrl_t); msg = malloc(total_len); if ( NULL = msg ) printf(“out of memeory!n“); return FAILED; msg-command = htonl(type); msg-body_len = htonl(body_len); memcpy(msg-msg_body, user_input, body_len); ret = send(sockfd, msg, total_len, 0); if

16、( ret body_len), MSG_PEEK); if (ret body_len = ntohl(msg-body_len); msg-command= ntohl(msg-command); if ( COMMAND_NO_FILE = msg-command ) printf(“File %s doesnt exist on servern“, user_input); ret = FAILED; goto Exit; 嘉应学院计算机学院 LINUX 系统 综合性实验报告 - 18 - if ( -1 = fd) fd = open(user_input, O_WRONLY|O_CREAT|O_EXCL, 0660); if ( -1 = fd) printf(“create file

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号