您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > linux的小型远程FTP服务系统
中北大学操作系统课程设计说明书学院、系:软件学院专业:软件工程学生姓名:学号:设计题目:基于linux的小型远程FTP服务系统的设计起迄日期:2011年12月22日-2012年1月7日指导教师:薛海丽2012年1月7日11需求分析1.1设计目的:用高级语言编写和调试一个简单的FTP服务系统,掌握对进程、线程、进程互斥、同步、通信、文件系统及网络编程的方法。从而加深学生对远程服务机制的理解和认识。1.2设计要求:①该系统要求有服务器端软件和客户端软件两部分组成,服务器端在指定端口接受客户连接请求,根据客户要求执行相应处理,客户端提供系统的交互界面②基于套接字得客户/服务器通信模式③远程登录功能要求集成linux系统的客户管理功能,对客户信息予以验证,客户发送连接请求时,提供FTP服务器软件在linux主机上的客户名及密码,请求命令格式如下:Ftps://客户名:密码@FTP服务器IP:port④并发执行及管理功能采用多线程,客户通过身份请求后创建一个新线程来响应客户请求。⑤活动客户计数功能统计当前的活动客户数,通过身份验证+1,断开连接-1⑥文件管理功能服务器端的文件基本操作包括:mkdir、rmdir、cd、ls客户端执行的基本操作包括:创建及删除目录、切换目录、查看当前目录下的所有文件设定文件传输模式:文本模式和二进制文件传输:upload/download到指定目录。1.3开发环境:本程序分为服务器端和客户端两部分,全部在RedHatEnterpriseLinux5系统中使用GCC编译执行,要求系统具有vsftpd组件。1.4程序特点:本程序主要使用套接口函数实现服务器端/客户端通信,具有较强的安全性设计和错误提示功能;采用多线程设计,可以保证多个客户端登陆同一服务器端而不冲突。程序使用命令提示符界面,在指定账户登录可实现全部功能,而在匿名账户下可实现部分功能。2.总体设计:2.1功能模块:本程序分为套接口通信模块、登录模块、命令解析模块、文件操作模块、文件传输模块共5个模块,具体如下:A.套接口通信模块:表2-1套接口函数列表函数名类型功能*Handle_Client_Request()void响应客户端请求do_client_work()void处理客户端动作sockaddr_increate_date_sock()struct创建数据管道send_client_info()void发送客户端信息recv_client_infoint接受客户端信息2fill_host_addr()int写入服务器地址xconnect()int连接服务器与客户端ftp_send_cmd()int发送FTP指令ftp_get_reply()int接受服务器回应xconnect_ftpdata()int传输数据handle_pasv()void设定FTP工作模式B.登录模块:表2-2登录模块函数列表函数名类型功能login()int客户端登录close_cli()void关闭客户端连接get_user()void获取账户名get_pass()void获取密码ftp_login()int登录到FTP服务器show_help()void显示帮助信息ftp_quit()void退出客户端C.命令解析模块:表2-3命令解析模块函数列表函数名类型功能cmd_err_exit()void处理错误的命令ftp_usr_cmd()int解析用户输入的命令start_ftp_cmd()int连接到服务器的命令ftp_cmd_filename()void处理文件名的命令D.文件操作模块:表2-4文件操作模块函数列表函数名类型功能ftp_list()void列出服务器文件列表ftp_pwd()void显示服务器当前所在目录ftp_cd()void转到服务器指定目录del()void删除文件mkdir_srv()void新建文件夹rmdir_srv()void删除文件夹local_list()void列出客户端文件列表local_pwd()void显示客户端当前所在目录local_cd()void转到客户端指定目录handle_cwd()void处理转换目录的请求handle_rmd()void处理删除目录的请求handle_mkd()void处理新建文件夹的请求handle_list()void处理列出文件列表的请求3E.文件传输模块:表2-4文件传输模块函数列表函数名类型功能ftp_put()void上传文件ftp_get()void下载文件handle_file()void检查文件handle_del()void删除文件2.2程序流程图图2-1程序流程图43.详细设计3.1客户端连接服务器相关代码:函数get_user()和get_pass()得到用户输入的用户名和密码。ftp_login()函数用输入字符与缺省用户名密码、匿名用户密码相比较,如果一致则登陆成功,否则失败。voidget_user()//得到输入用户名{charread_buf[64];printf(User(Pressforanonymous):);fgets(read_buf,sizeof(read_buf),stdin);if(read_buf[0]=='\n')strncpy(user,anonymous,9);elsestrncpy(user,read_buf,strlen(read_buf)-1);}voidget_pass()//得到输入密码{charread_buf[64];printf(Password(Pressforanonymous):);echo_off();//隐藏密码fgets(read_buf,sizeof(read_buf),stdin);if(read_buf[0]=='\n')strncpy(passwd,anonymous,9);elsestrncpy(passwd,read_buf,strlen(read_buf)-1);echo_on();//取消隐藏printf(\n);}intftp_login()//登陆函数{interr;get_user();if(ftp_send_cmd(USER,user,sock_control)0)cmd_err_exit(Cannotsendmessage,1);;err=ftp_get_reply(sock_control);//得到服务器返回if(err==331){get_pass();if(ftp_send_cmd(PASS,passwd,sock_control)=0)cmd_err_exit(Cannotsendmessage,1);elseerr=ftp_get_reply(sock_control);if(err==230)//缺省用户5{return1;}elseif(err==531)//匿名用户{return2;}else{printf(Passworderror!\n);return0;}}else{printf(Usererror!\n);return0;}}图3-1打开服务器端和客户端函数intxconnect(structsockaddr_in*s_addr,inttype)连接到服务器。intxconnect(structsockaddr_in*s_addr,inttype)6{structtimevalouttime;intset;ints=socket(AF_INET,SOCK_STREAM,0);if(s0)cmd_err_exit(creatsocketerror!,249);set=setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime));if(set!=0){printf(setsocket%serrno:%d\n,strerror(errno),errno);cmd_err_exit(setsocket,1);}//connecttotheserverif(connect(s,(structsockaddr*)s_addr,sizeof(structsockaddr_in))0){printf(Can'tconnecttoserver%s,port%d\n,\inet_ntoa(s_addr-sin_addr),ntohs(ftp_server.sin_port));exit(252);}returns;}fgets(read_buf,sizeof(read_buf),stdin);得到用户名和密码的关键函数。读入数据。ints=socket(AF_INET,SOCK_STREAM,0);if(s0)cmd_err_exit(creatsocketerror!,249);7图3-2用户登录创建套接字,如创建成功,socket函数返回非负值。//connecttotheserverif(connect(s,(structsockaddr*)s_addr,sizeof(structsockaddr_in))0){printf(Can'tconnecttoserver%s,port%d\n,\inet_ntoa(s_addr-sin_addr),ntohs(ftp_server.sin_port));exit(252);}连接到服务器,如果连接成功,connect函数返回0,如果不成功,返回-1。intftp_send_cmd(constchar*s1,constchar*s2,intsock_fd)向服务器发送客户端的命令的函数。intftp_send_cmd(constchar*s1,constchar*s2,intsock_fd){charsend_buf[256];intsend_err,len;if(s1){strcpy(send_buf,s1);if(s2){strcat(send_buf,s2);strcat(send_buf,\r\n);8len=strlen(send_buf);send_err=send(sock_fd,send_buf,len,0);}else{strcat(send_buf,\r\n);len=strlen(send_buf);send_err=send(sock_fd,send_buf,len,0);}}if(send_err0)printf(send()error!\n);returnsend_err;}接收服务器返回信息函数//gettheserver'sreplymessagefromsock_fdintftp_get_reply(intsock_fd){staticintreply_code=0,count=0;charrcv_buf[512];count=read(sock_fd,rcv_buf,510);if(count0)reply_code=atoi(rcv_buf);elsereturn0;while(1){if(count=0)break;rcv_buf[count]='\0';printf(%s,rcv_buf);count=read(sock_fd,rcv_buf,510);}returnreply_code;}send_err=send(sock_fd,send_buf,len,0);send函数发送成功返回字节数大于0,小于0则出错。intxconnect_ftpdata()连接服务器数据流函数。get_sock=socket(AF_INET,SOCK_STREAM,0);set=setsockopt(get_sock,SOL_SOCKET,SO_RCVTIMEO,\&outtime,sizeof(outtime));set=setsockopt(get_sock,SOL_SOCKET,SO_REUSEADDR,\&opt,sizeof(opt));9新建套接字传输数据流。set=bind(get_s
本文标题:linux的小型远程FTP服务系统
链接地址:https://www.777doc.com/doc-5482769 .html