FTP文件传输的设计与实现Word格式文档下载.doc
《FTP文件传输的设计与实现Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《FTP文件传输的设计与实现Word格式文档下载.doc(15页珍藏版)》请在冰点文库上搜索。
![FTP文件传输的设计与实现Word格式文档下载.doc](https://file1.bingdoc.com/fileroot1/2023-4/30/418dbcdb-1475-4cf0-a3c7-66c7054ebaba/418dbcdb-1475-4cf0-a3c7-66c7054ebaba1.gif)
//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,(structsockaddrFAR*)&
addrSrv,sizeof(addrSrv))==SOCKET_ERROR)
BindError"
return
(1);
}
intSendFileRecord(SOCKETdatatcps,WIN32_FIND_DATA*pfd)//用于回复给客户端
charfilerecord[MAX_PATH+32];
FILETIMEft;
FileTimeToLocalFileTime(&
pfd->
ftLastWriteTime,&
ft);
//将一个FILETIME结构转换成本地时间
SYSTEMTIMElastwtime;
//系统时间
FileTimeToSystemTime(&
ft,&
lastwtime);
//根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构
char*dir=pfd->
dwFileAttributes&
FILE_ATTRIBUTE_DIRECTORY?
"
<
DIR>
:
"
;
sprintf(filerecord,"
%04d-%02d-%02d%02d:
%02d%5s%10d%-20s\n"
lastwtime.wYear,
lastwtime.wMonth,
lastwtime.wDay,
lastwtime.wHour,
lastwtime.wMinute,
dir,
pfd->
nFileSizeLow,
cFileName);
if(send(datatcps,filerecord,strlen(filerecord),0)==SOCKET_ERROR)//发送回复失败
Erroroccurswhensendingfilelist!
return0;
return1;
//发送主机文件目录
intSendFileList(SOCKETdatatcps)
HANDLEhff;
WIN32_FIND_DATAfd;
//获取和更改文件属性
hff=FindFirstFile("
*"
&
fd);
//搜索文件
if(hff==INVALID_HANDLE_VALUE)//搜索无效返回值
constchar*errstr="
can'
tlistfiles!
cout<
listfileerror!
endl;
if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR)
{
cout<
erroroccurswhensendingfilelist!
}
closesocket(datatcps);
BOOLfMoreFiles=TRUE;
//BOOL型,返回值为大于0的整数时为TRUE,返回值为0时候,为FALSE,返回值为-1时为ERROR。
while(fMoreFiles)
//发送此项文件信息
if(!
SendFileRecord(datatcps,&
fd))//发送失败
closesocket(datatcps);
return0;
//搜索下一个文件
fMoreFiles=FindNextFile(hff,&
closesocket(datatcps);
//发送数据
intSendFile(SOCKETdatatcps,FILE*file)//发送文件
printf("
sendingfiledata.."
for(;
//从文件中循环读取数据并发送客户端
intr=fread(buf_send,1,1024,file);
if(send(datatcps,buf_send,r,0)==SOCKET_ERROR)
printf("
losttheconnectiontoclient!
if(r<
1024)//文件传送结束
break;
done\n"
DWORDProcessCmd()
if(listen(sockSrv,5)<
0)//监听信号
Listenerror!
cout<
Listeningfortherequest……"
SOCKADDR_INaddrclient;
//定义用于返回客户机端地址的结构
intlen=(sizeof(SOCKADDR_IN));
while
(1)
SOCKETsockconn=accept(sockSrv,(SOCKADDR*)&
addrclient,&
len);
//接受请求,产生新的套接字
if(sockconn==INVALID_SOCKET)
continue;
elsecout<
connectingfromclient"
while(true)
charfilename[20];
memset(buf_rec,0,1024);
memset(buf_send,0,1024);
if(recv(sockconn,buf_rec,1024,0)<
=0)
{
break;
}
endl<
thecommandis:
buf_rec<
if(strncmp(buf_rec,"
dir"
3)!
=0&
&
strncmp(buf_rec,"
get"
put"
continue;
//有一个请求正确执行下面语句
3)==0)
strcpy(buf_send,"
dir-ing\n"
send(sockconn,buf_send,1024,0);
SendFileList(sockconn);
//发送当前所有文件名
}//dir
if(strncmp(buf_rec,"
{
strcpy(filename,buf_rec+4);
cout<
filename;
FILE*file;
//处理下载文件请求
file=fopen(filename,"
rb"
//打开下载的文件
if(file)
{
sprintf(buf_send,"
getfile%s\n"
filename);
if(!
send(sockconn,buf_send,1024,0))
{fclose(file);
return0;
else
{//创建额外数据连接传送数据
if(!
SendFile(sockconn,file))
return0;
fclose(file);
}//file
else//打开文件失败
{
strcpy(buf_send,"
topenfile!
if(send(sockconn,buf_send,1024,0))
return0;
}
}//get处理客户端的下载请求
FILE*fd;
intcount;
fd=fopen(filename,"
wb"
if(fd==NULL)
printf("
openfile%sforweitefailed!
continue;
}
sprintf(buf_send,"
putfile%s"
if(!
{ fclose(fd);
return0;
while((count=recv(sockconn,buf_rec,1024,0))>
0)
fwrite(buf_rec,sizeof(char),count,fd);
fclose(fd);
}//put处理客户端的上传请求
intmain()
CreateSocket();
ProcessCmd();
return
(1);
客户端程序源代码:
//使用名称空间std
)//将WinLib.lib库加入到工程中进行编译
#definePORT4523//定义端口号为4523
charsend_str[1024];
charrec_str[1024];
charIP[20];
charfilename[20];
SOCKETsockClient;
SOCKADDR_INaddrServer;
//定义表示地址的结构体addrServer,用来表示本地地址
//创建套接字
DWORDCreateSock()
//本地信息
addrServer.sin_family=AF_INET;
//AF表示ADDRESSFAMILY地址族
//htons的功能:
将一个无符号短整型数值转换为网络字节序
addrServer.sin_port=htons(PORT);
WORDwVersionRequsdted;
interr;
wVersionRequsdted=MAKEWORD(2,2);
err=WSAStartup(wVersionRequsdted,&
WSAData);
if(err!
=0){
sockinitfail!
pleaseinputtheIPofhost:
scanf("
%s"
IP);
addrServer.sin_addr.s_addr=inet_addr(IP);
DWORDConnectServer()//连接服务器
sockClient=socket(AF_INET,SOCK_STREAM,0);
//创建套接字,SOCK_STREAM为面向连接型
if(sockClient==SOCKET_ERROR)
sockcreatefail!
//中止WindowsSocketsDLL的使用.
if(connect(sockClient,(structsockaddr*)&
addrServer,sizeof(addrServer))==SOCKET_ERROR)//如果请求建立连接错误
Connectfail\n"
memset(IP,0,20);
voidhelp()
helpList:
dir………………………………directorylist"
get………………………………downloadfiles"
put………………………………uploadfiles"
quit………………………………exit!
//list读取服务器列表
voidlist(SOCKETsock)
intnRead;
while(true)
nRead=recv(sock,rec_str,1024,0);
//从一个套接口接收数据
if(nRead==SOCKET_ERROR)
readresponseerror!
exit
(1);
if(nRead==0)//数据读取结束
//显示数据
rec_str[nRead]='
\0'
rec_str);
intSendFile(SOCKETdatatcps,FILE*file)//SOCKETdatatcps定义变量数据连接套接字
intr=fread(send_str,1,1024,file);
//从一个流中读数据
if(send(datatcps,send_str,r,0)==SOCKET_ERROR)
//关闭接口
intCprocess()
intcount;
charorder[10];
charparam[20];
charcommand[30];
FILE*fd;
FILE*fd2;
command[0]='
CreateSock();
ConnectServer();
pleaseinputorder:
memset(order,0,10);
//初始化为0
memset(param,0,20);
memset(command,0,30);
memset(rec_str,0,1024);
memset(send_str,0,1024);
cin>
>
order;
strcat(command,order);
if(strncmp(order,"
3)==0||strncmp(order,"
3)==0)//输入请求,有一个输入要求正确,输入目标文件名
cin>
param;
strcat(command,"
strcat(command,param);
command<
strcpy(send_str,command);
if(send(sockClient,send_str,sizeof(send_str),0)<
senddataerror!
closesocket(sockClient);
recv(sockClient,rec_str,1024,0);
//接受链接数据,放入rec_str
rec_str<
if(strncmp(command,"
quit"
4)==0)
}//quit
if(strncmp(rec_str,"
list(sockClient);
}//dir
{
fd=fopen(param,"
//使用二进制方式创建并打开名为param的文件
if(fd==NULL)//打开失败
param);
while((count=recv(sockClient,rec_str,1024,0))>
0)//接收文件,放入rec_str
fwrite(rec_str,sizeof(char),count,fd);
}//get
if(strncmp(rec_str,"
strcpy(filename,rec_str+9);
//复制需发送的文件名称,赋给filename
fd2=fopen(filename,"
if(fd2)//假如读文件成功
SendFile(sockClient,fd2))//假如发送失败
{
printf("
sendfailed!
}
fclose(fd2);
strcpy(send_str,"
if(send(sockClient,send_str,1024,0))
}//put
closesocket(sockClient);
WSACleanup();
returnCprocess();
help();
Cprocess();
return0;
程序运行结果
一.正确功能实现
1.运行客户端,输入服务器正确IP地址,连接成功后,输入dir查看服务器所在文件夹中的文件
2.用put命令发送文件a.txt,发送完毕,查看服务器所在文件夹,发现a.txt存在
3.使用get命令
使用前,客户端所在文件夹文件如下图
在对话框中输入gets.exe
再看文件夹,发现出现s.exe
以上三步完成后,看服务器端窗口显示
二.运行错误测试
1.运行客户端,输入错误的IP地址。
输入请求后,显示框直接关闭
2.发送客户端文件夹中不存在的文件(c.txt)时,客户端显示框直接关闭,服务器端显示为
3.下载服务器文件夹中不存在文件时,服务器端直接关闭,客户端显示框如下
4.输入错误指令时,客户端显示如下,显示后,无法输入任何文字
服务器显示如下