TCP_IP课程设计报告
ftp协议
《TCP/IP课程设计》
报告
指导教师
专业班级 学 号 姓 名
ftp协议
1. 设计目的:
文件传输是应用层中的一个主要协议,负责将主机中的文件从一台机器传送到另一台机器。文件传输协议FTP采用客户/服务器的工作模式,由客户端产生操作要求,服务器接收到该请求后返回响应。
此次课程设计的目的是通过对课程所学相关知识的实践,加深对TCP/IP socket编程原理的理解,熟练对TCP/IP socket编程方法和技巧的掌握。
2.功能描述:
采用Client/Server模式实现ftp功能:
1)客户端:
客户端利用用户名、口令登录
客户端能够以控制台方式浏览服务器目录及文件(ls, cd); 完成与FTP用户的人机界面,以命令的方式向服务器请求服务; 2)服务器端: 允许用户登录服务器;
接收客户端的命令请求并能够并发的实现上传(put)、下载(get)文件服务;
3设计原理:
服务器端通过socket()系统调用创建一个Socket,与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则通过系统调用accept()将客户端地址赋给这个Socket。然后等待客户登录,若有客户成功登录则利用系统调用fork()创建子进程并发的为客户提供ftp服务。客户端程序相对简单,只需要建立一个Socket与系统调用connect()与服务器端连接,然后成功登录后通过这个Socket来发送ftp服务请求和接收数据就可以了。
4.系统详细设计:
1)服务器端:
a.程序流程图:
ftp协议
b.数据结构设计:
在服务器端定义了5个全局变量:
#define BUFSIZE 1024 //每次传送文件大小 #define QLEN 20 //监听队列允许最大数目 char inbuf[BUFSIZE+1]; //输入缓冲大小 char outbuf[BUFSIZE+1]; //输出缓冲大小
unsigned int inlen,outlen; //inbuf及outbuf的长度
在每次传输报文件前加了一个结构体变量,标识了传送文件大小,本次传送大小,已传送了多少及这是这个文件传送的第几次。 typedef struct fileheadnode{
unsigned long filesize;//文件大小。
unsigned long nowfilelen;//当前文件以发送大小。
ftp协议
unsigned long clen;//此次发送数据大小。 unsigned long ctimes;//此次是发送的第几次。
}filehead; c.函数功能描述: 1)int logined(int cl_soc);
这个函数用来允许客户登录到服务器,如果客户端登录名及密码均正确,则登录成功,反之,登录失败。 int ftpserver(int cl_soc);
此函数用来实现循环接受客户端请求,并根据请求调用相关函数实现服务功能。 int get(int cl_soc,char (*comv)[50]); get函数的作用是处理客户端的下载请求。 int put(int cl_soc,char (*comv)[50]); put函数的作用是处理客户端的上传请求。 int ls(int cl_soc,char (*comv)[50]); ls()函数允许客户端遍历服务器端文件 int cd(int cl_soc,char (*comv)[50]);
函数cd()的作用是打开服务器的文件目录。
C.服务器端代码: #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include <stdlib.h> #include<string.h> #include<unistd.h> #include <netdb.h> #include <stdlib.h> #include <dirent.h> #include<sys/stat.h>
ftp协议
#define BUFSIZE 1024 #define QLEN 20 char inbuf[BUFSIZE+1]; char outbuf[BUFSIZE+1]; unsigned int inlen,outlen; char comv[3][50]; char file[50];
typedef struct fileheadnode{
unsigned long filesize;//文件大小。
unsigned long nowfilelen;//当前文件以发送大小。 unsigned long clen;//此次发送数据大小。 unsigned long ctimes;//此次是发送的第几次。
}filehead; filehead header;
int logined(int cl_soc); int ftpserver(int cl_soc);
int get(int cl_soc,char (*comv)[50]); int put(int cl_soc,char (*comv)[50]); int ls(int cl_soc,char (*comv)[50]); int cd(int cl_soc,char (*comv)[50]);
int main(int argc,char *argv[]) {
int sev_soc,cl_soc;
unsigned int sev_len,cl_len; char *service="21";
unsigned short portbase = 0;
ftp协议
int n=0,len=0;
struct sockaddr_in sev_addr,cl_addr; switch (argc) { case
1:
break;
2:
case
service = argv[1]; break;
default: }
printf("usage: tcpftp [port]\n");
memset(&sev_addr, 0, sizeof(sev_addr)); inlen=sizeof(inbuf); outlen=sizeof(outbuf);
sev_addr.sin_family=AF_INET;
sev_addr.sin_addr.s_addr=INADDR_ANY; if ( pse = getservbyname(service,"tcp") )
sev_addr.sin_port = htons(ntohs((unsigned short)pse->s_port) + portbase);
else if ((sev_addr.sin_port=htons((unsigned short)atoi(service))) == 0)
printf("can't get service entry\n");
sev_soc=socket(PF_INET,SOCK_STREAM,0); sev_len=sizeof(sev_addr);
bind(sev_soc,(struct sockaddr *)&sev_addr,sev_len);
ftp协议
while(1) {
cl_len=sizeof(cl_addr);
cl_soc=accept(sev_soc,(struct sockaddr *)&cl_addr,&cl_len); if (logined(cl_soc)!=0) { }
(void) close(cl_soc); continue;
printf("\n---------an user in-----------\n");
switch (fork()) { case 0:
/* child */
close(sev_soc);
ftpserver(cl_soc);
}
printf("\n---------an user out-----------\n"); return 0;
default: /* parent */
(void) close(cl_soc); break;
case -1: }
//close(cl_soc);
printf("\n-------------fork error -----------\n");
ftp协议
}
return 0;
int logined(int cl_soc) { }
int ftpserver(int cl_soc) {
char user[2][20]; memset(outbuf,0,outlen); memset(user,0,sizeof(user));
strcpy(outbuf,"Please enter UserName and PassWord:\n"); write(cl_soc,outbuf,strlen(outbuf)); read(cl_soc,user,sizeof(user));
if (strcmp(user[0],"123")==0&&strcmp(user[1],"123")==0) { } else { }
memset(outbuf,0,outlen);
strcpy(outbuf,"UserName or PassWord error\n"); write(cl_soc,outbuf,strlen(outbuf)); return -1;
memset(outbuf,0,outlen); strcpy(outbuf,"success\n"); write(cl_soc,outbuf,strlen(outbuf)); return 0;
ftp协议
strcpy(file,"/root/ftp/"); int …… 此处隐藏:5579字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [文秘资料]班长职务辞职报告
- [文秘资料]完美的辞职报告
- [文秘资料]经典的员工辞职报告
- [文秘资料]医院口腔医生辞职报告
- [文秘资料]总经理辞职报告范文四篇
- [文秘资料]超市职员个人辞职报告
- [文秘资料]村妇联主任的辞职报告
- [文秘资料]辞职报告书格式
- [文秘资料]酒店辞职报告简单范文
- [文秘资料]联通的辞职报告
- [文秘资料]2017最新私企员工辞职报告范文
- [文秘资料]2019年度医院基层党组织书记抓党建述职
- [文秘资料]工作时间长辞职报告
- [文秘资料]辞职报告怎么写出来
- [文秘资料]个人能力原因辞职报告
- [文秘资料]网络工程师辞职报告
- [文秘资料]项目部辞职报告
- [文秘资料]缝纫工辞职报告怎么写
- [文秘资料]XXX州委书记述职报告
- [文秘资料]抓基层党建工作述职报告
- (王虎应老师讲课记录)六爻理象思维
- 八个常见投影机故障排除法
- 质量专业综合知识(中级)第一章质量管理
- 煤矿班组建设实施意见
- 我国快餐业与肯德基经营模式的比较与分
- 汽车保险杠模具标准化模架技术工艺研究
- 汽车二级维护作业团体赛比赛规程
- 装卸搬运工安全操作规程
- 高效的工作方法-刘铁
- 依据《生产安全事故报告和调查处理条例
- 2015专业PS夜景亮化效果图制作教程
- 企业劳动定额定员浅析
- 中枢神经系统医学影像学本科五年制第五
- 长城汽车参观探营第三站:研发试验中心
- 小升初语文专项训练
- 建筑工程质量检测资质分类与等级标准
- 周燕珉-我国养老社区的发展现状与规划
- 《生命里最后的读书会》读后感
- 实验室管理评审报告
- CCNA思科网院教程精华之网络基础知识




