《linux网络编程课程设计报告书.pdf》由会员分享,可在线阅读,更多相关《linux网络编程课程设计报告书.pdf(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.Linu*网络编程 课程设计 班级:指导教师:一、设计背景 Linu*操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!只要是基于 GNU 公约的软件你都可以任意使用并修改它的源代码。通过这次课程设计能更好的学习网络编程知识和掌握 LINU*平台上应用程序设计开发的过程,将大学四年所学知识综合运用,为未来的工作学习打下根底。二、设计目的 1、学习 epoll 跟 FTP 被动模式 2、掌握 linu*根本命令,例如ls、cd、login;3、学会如何编译、运行 三、环境要求 1、centos 64 位操作系统 2、gcc 编译器.四、设计原理 41 客户
2、端 客户端程序的主要任务有以下 3 个:1、分析用户输入的命令。2、根据命令向效劳器发出请求 3、承受效劳器返回请求的结果 客户端为用户提供了 3 种命令:1、get:从效劳器下载文件2、list:列出客户端当前目录的容3、quit 离开 4.2 效劳器端 1、分析请求代码。2、根据请求代码做相应的处理 3、等待返回结果或者应答信息 五、软件测试结果 六、局部主代码#include ftserve.h int main(int argc,char*argv)int sock_listen,sock_control,port,pid;if(argc!=2)printf(usage:./ftser
3、ve portn);e*it(0);port=atoi(argv1);/create socket if(sock_listen=socket_create(port)0)perror(Error creating socket);e*it(1);while(1)/wait for client request /create new socket for control connection if(sock_control=socket_accept(sock_listen)0)break;/create child process to do actual file transfer if
4、(pid=fork()0)perror(Error forking child process);else if(pid=0).close(sock_listen);ftserve_process(sock_control);close(sock_control);e*it(0);close(sock_control);close(sock_listen);return 0;/*Send file specified in filename over data connection,sending *control message over control connection *Handle
5、s case of null or invalid filename */void ftserve_retr(int sock_control,int sock_data,char*filename)FILE*fd=NULL;char dataMA*SIZE;size_t num_read;fd=fopen(filename,r);if(!fd)/send error code(550 Requested action not taken)send_response(sock_control,550);else /send okay(150 File status okay)send_resp
6、onse(sock_control,150);do num_read=fread(data,1,MA*SIZE,fd);if(num_read 0)printf(error in fread()n);/send block if(send(sock_data,data,num_read,0)0);/send message:226:closing conn,file transfer successful send_response(sock_control,226);fclose(fd);/*Send list of files in current directory.*over data
7、 connection *Return-1 on error,0 on success */int ftserve_list(int sock_data,int sock_control)char dataMA*SIZE;size_t num_read;FILE*fd;int rs=system(ls-l|tail-n+2 tmp.t*t);if(rs 0)if(send(sock_data,data,num_read,0)0)perror(err);memset(data,0,MA*SIZE);fclose(fd);send_response(sock_control,226);/send
8、226 return 0;/*Open data connection to client *Returns:socket for data connection *or-1 on error */int ftserve_start_data_conn(int sock_control)char buf1024;int wait,sock_data;/Wait for go-ahead on control conn if(recv(sock_control,&wait,sizeof wait,0)0)perror(Error while waiting);return-1;./Get cli
9、ent address struct sockaddr_in client_addr;socklen_t len=sizeof client_addr;getpeername(sock_control,(struct sockaddr*)&client_addr,&len);inet_ntop(AF_INET,&client_addr.sin_addr,buf,sizeof(buf);/Initiate data connection with client if(sock_data=socket_connect(CLIENT_PORT_ID,buf)0)return-1;return soc
10、k_data;/*Authenticate a users credentials *Return 1 if authenticated,0 if not */int ftserve_check_user(char*user,char*pass)char usernameMA*SIZE;char passwordMA*SIZE;char*pch;char bufMA*SIZE;char*line=NULL;size_t num_read;size_t len=0;FILE*fd;int auth=0;fd=fopen(.auth,r);if(fd=NULL)perror(file not fo
11、und);e*it(1);while(num_read=getline(&line,&len,fd)!=-1)memset(buf,0,MA*SIZE);strcpy(buf,line);pch=strtok(buf,);strcpy(username,pch);if(pch!=NULL)pch=strtok(NULL,);strcpy(password,pch);/remove end of line and whitespace trimstr(password,(int)strlen(password);if(strcmp(user,username)=0)&(strcmp(pass,p
12、assword)=0)auth=1;break;.free(line);fclose(fd);return auth;/*Log in connected client */int ftserve_login(int sock_control)char bufMA*SIZE;char userMA*SIZE;char passMA*SIZE;memset(user,0,MA*SIZE);memset(pass,0,MA*SIZE);memset(buf,0,MA*SIZE);/Wait to recieve username if(recv_data(sock_control,buf,size
13、of(buf)=-1)perror(recv errorn);e*it(1);int i=5;int n=0;while(bufi!=0)usern+=bufi+;/tell client were ready for password send_response(sock_control,331);/Wait to recieve password memset(buf,0,MA*SIZE);if(recv_data(sock_control,buf,sizeof(buf)=-1)perror(recv errorn);e*it(1);i=5;n=0;while(bufi!=0)passn+
14、=bufi+;return(ftserve_check_user(user,pass);/*Wait for mand from client and *send response.*Returns response code */int ftserve_recv_cmd(int sock_control,char*cmd,char*arg)int rc=200;char bufferMA*SIZE;memset(buffer,0,MA*SIZE);memset(cmd,0,5);memset(arg,0,MA*SIZE);/Wait to recieve mand if(recv_data(
15、sock_control,buffer,sizeof(buffer)=-1)perror(recv errorn);return-1;strncpy(cmd,buffer,4);char*tmp=buffer+5;strcpy(arg,tmp);if(strcmp(cmd,QUIT)=0)rc=221;else if(strcmp(cmd,USER)=0)|(strcmp(cmd,PASS)=0)|(strcmp(cmd,LIST)=0)|(strcmp(cmd,RETR)=0)rc=200;else /invalid mand rc=502;send_response(sock_contro
16、l,rc);return rc;/*Child process handles connection to client */void ftserve_process(int sock_control)int sock_data;char cmd5;char argMA*SIZE;/Send wele message send_response(sock_control,220);/Authenticate user if(ftserve_login(sock_control)=1)send_response(sock_control,230);else send_response(sock_
17、control,430);e*it(0);.while(1)/Wait for mand int rc=ftserve_recv_cmd(sock_control,cmd,arg);if(rc 0)|(rc=221)break;if(rc=200)/Open data connection with client if(sock_data=ftserve_start_data_conn(sock_control)0)close(sock_control);e*it(1);/E*ecute mand if(strcmp(cmd,LIST)=0)/Do list ftserve_list(sock_data,sock_control);else if(strcmp(cmd,RETR)=0)/Do get ftserve_retr(sock_control,sock_data,arg);/Close data connection close(sock_data);七、设计总结 通过本次的 linu*程序与设计课程设计让我们学会使用 linu*系统和 socket,极大的丰富了 linu*系统下编程和网络方面的知识,锻炼了动手能力,为以后的工作学习打下了坚实的根底。
限制150内