实验一-文件传输协议设计实验一-文件传输协议设计
实验一:文件传输协议的设计与实现
1.实验设计目的和要求 2.背景知识
3.课程设计分析 4.程序清单
5.运行结果
6.总结
1.课程设计目的和要求
文件传输是各种计算机的网络的基本功能,文件传送协议是一种最基本的应用层协议。它是按照客户或服务器模式进行的工作,提供交式的访问。是INTERNRT使用最广泛的协议之一。以及深入了解计算机网络是建立在TCP/IP网络体系结构上。
用 socket 编程接口编写俩个程序,分别为客户程序和服务器程序
1(掌握TCP/IP 网络应用程序基本的...
实验一-文件传输
实验一:文件传输协议的设计与实现
1.实验设计目的和要求 2.背景知识
3.课程设计
4.程序清单
5.运行结果
6.总结
1.课程设计目的和要求
文件传输是各种计算机的网络的基本功能,文件传送协议是一种最基本的应用层协议。它是按照客户或服务器模式进行的工作,提供交式的访问。是INTERNRT使用最广泛的协议之一。以及深入了解计算机网络是建立在TCP/IP网络体系结构上。
用 socket 编程接口编写俩个程序,分别为客户程序和服务器程序
1(掌握TCP/IP 网络应用程序基本的设计方法;
2(用socket 编程接口编写两个程序,分别为客户程序(client.c)和服务器程
序(server.c);
3(撰写课程设计说明书。装订后的课程设计说明书不少于10面(含封面、
任务书、目录、正文、参考文献、成绩评定表、封底)。 2.背景知识
第一个FTP的RFC由A.K.Bhushan 在1971年提出,同时由MIT与Harvard实验实现,RFC 172提供了主机间文件传输的一个用户级协议。长期发展过程由于底层协议从NCP改变为TCP,RFC765定义了采用TCP的FCP.
FTP协议在今天已经发展成熟,应用也越来越广很多开发的比较成熟的FTP客户端软件已经得到了广泛的应用.
3.课程设计分析
Server端 Client端
创建ServerSocket对象,在某端口提供监听服务Client端
等待来自Client端的服务请求
接受Client端的请求,用返回的 创建Socket对象,向Server Socket建立连接 的监听端口请求
通过向Socket中读写数据来 通过向新的Socket中读写数 Client端通信 据来与Server端通信 与
关闭Socket,结束与Server端的通信 关闭Socket,结束与当前
Client的通信,等待其他请求
关闭ServerSocket对象,结束监听服务
4.程序清单:
1. 服务器源代码:
#include
#include
#include
using namespace std;
#pragma comment(lib, "wsock32.lib") #define PORT 4523
char buf_send[1024];
char buf_rec[1024];
SOCKET sockSrv;
//socket初始化
DWORD CreateSocket()
{
WSADATA WSAData;//WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//WSAStartup完成winsock的初始化
{printf("socket initialize failed!\n");
return (-1);
}
sockSrv=socket(AF_INET,SOCK_STREAM,0);//定义为面向连接的,返回值送给sockSrv
if(sockSrv==SOCKET_ERROR)
{
printf("socket create failed ! \n");
WSACleanup();//中止Windows Sockets DLL的使用
return(-1);
}
SOCKADDR_IN addrSrv;//TCP/IP使用SOCKADDR_IN 定义地址
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//计算机IP地址
addrSrv.sin_port=htons(PORT);//协议端口号
addrSrv.sin_family=AF_INET;//地址所属协议簇
//绑定端口
if(bind(sockSrv,(struct sockaddr FAR *)&addrSrv,sizeof(addrSrv))==SOCKET_ERROR)
{
printf("Bind Error");
return(-1);
}
return (1);
}
int SendFileRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)//用于回复给客户端 {
char filerecord[MAX_PATH+32];
FILETIME ft;
FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);//将一个FILETIME结构转换成本地时间
SYSTEMTIME lastwtime;//系统时间
FileTimeToSystemTime(&ft,&lastwtime);//根据一个FILETIME结构的内容,装载一个SYSTEMTIME
结构
char *dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"":" ";
sprintf(filerecord,"%04d-%02d-%02d %02d:%02d %5s %10d %-20s\n",
lastwtime.wYear,
lastwtime.wMonth,
lastwtime.wDay,
lastwtime.wHour,
lastwtime.wMinute,
dir,
pfd->nFileSizeLow,
pfd->cFileName);
if(send(datatcps,filerecord,strlen(filerecord),0)==SOCKET_ERROR)//发送回复失败
{
printf("Error occurs when sending file list!\n");
return 0;
}
return 1;
}
//发送主机文件目录
int SendFileList(SOCKET datatcps) {
HANDLE hff;
WIN32_FIND_DATA fd; //获取和更改文件属性
hff=FindFirstFile("*",&fd);//搜索文件
if(hff==INVALID_HANDLE_VALUE)//搜索无效返回值
{
const char *errstr="can't list files!\n";
cout<<"list file error!"<0)
fwrite(buf_rec,sizeof(char),count,fd);
fclose(fd);
continue;
}//put 处理客户端的上传请求
}
}
}
int main()
{
CreateSocket();
ProcessCmd();
return(1);
}
2. 客户端程序源代码:
#include
#include
#include
using namespace std;//使用名称空间std
#pragma comment(lib, "wsock32.lib")//将WinLib.lib库加入到工程中进行编译 #define PORT 4523//定义端口号为4523
char send_str[1024];
char rec_str[1024];
char IP[20];
char filename[20];
SOCKET sockClient;
SOCKADDR_IN addrServer;//定义表示地址的结构体addrServer,用来表示本地地址 //创建套接字
DWORD CreateSock()
{
//本地信息
addrServer.sin_family=AF_INET;//地址所属协议簇
//AF表示ADDRESS FAMILY 地址族
// htons的功能:将一个无符号短整型数值转换为网络字节序
addrServer.sin_port=htons(PORT);//协议端口号
WSADATA WSAData;//WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息
WORD wVersionRequsdted;
int err;
wVersionRequsdted=MAKEWORD(2,2);
err=WSAStartup(wVersionRequsdted,&WSAData);
if(err!=0){
printf("sock init fail!\n");
return(-1);
}
cout<<"please input the IP of host:";
scanf("%s",&IP);
addrServer.sin_addr.s_addr=inet_addr(IP);//计算机IP地址
return(1);
}
DWORD ConnectServer() //连接服务器
{
sockClient=socket(AF_INET,SOCK_STREAM,0);//创建套接字,SOCK_STREAM为面向连接型
if(sockClient==SOCKET_ERROR)
{
printf("sock create fail! \n");
WSACleanup();//中止Windows Sockets DLL的使用.
return(-1);
}
if(connect(sockClient,(struct sockaddr *)&addrServer,sizeof(addrServer))==SOCKET_ERROR)//如果请求建立连接错误
{
printf("Connect fail \n");
memset(IP,0,20);
return(-1);
}
return(1);
}
void help()
{
cout<<"help List:"<>order;
strcat(command,order);
if(strncmp(order,"get",3)==0||strncmp(order,"put",3)==0)//输入请求,有一个输入要求正确,
输入目标文件名
{
cin>>param;
strcat(command," ");
strcat(command,param);
}
cout<0)//接收文件,放入rec_str
{
fwrite(rec_str,sizeof(char),count,fd);}
fclose(fd);
}//get
if(strncmp(rec_str,"put",3)==0)
{
strcpy(filename,rec_str+9);//复制需发送的文件名称,赋给filename
fd2=fopen(filename,"rb");
if(fd2)//假如读文件成功
{
if(!SendFile(sockClient,fd2))//假如发送失败
{
printf("send failed!");
return 0;
}
fclose(fd2);
}
else//打开文件失败
{
strcpy(send_str,"can't open file!\n");
if(send(sockClient,send_str,1024,0))
return 0;
}
}//put
closesocket(sockClient);
WSACleanup();
return Cprocess(); }
int main()
{
help();
Cprocess();
return 0;
}
5.程序运行结果
一(正确功能实现
1. 运行客户端,输入服务器正确IP地址,连接成功后,输入dir查看服务器
所在文件夹中的文件
2. 用put命令发送文件p.txt,发送完毕,查看服务器所在文件夹,发现p.txt
存在
二( 运行错误测试
1.运行客户端,输入错误的IP地址。输入请求后,显示框直接关闭
本文档为【实验一-文件传输协议设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。