文件传输协议的设计与实践Word下载.docx
- 文档编号:21460471
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:17
- 大小:57.74KB
文件传输协议的设计与实践Word下载.docx
《文件传输协议的设计与实践Word下载.docx》由会员分享,可在线阅读,更多相关《文件传输协议的设计与实践Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
}
if(strncmp(IP,a,20)==0)//比较IP与a
pleaseinputtheIPofhost:
"
scanf("
%s"
&
IP);
}
//定义本地地址信息
addrServer.sin_family=AF_INET;
//地址所属协议簇
addrServer.sin_addr.s_addr=inet_addr(IP);
//计算机IP地址
addrServer.sin_port=htons(PORT);
//协议端口号
return1;
DWORDConnectServer()//连接服务器
sockClient=socket(AF_INET,SOCK_STREAM,0);
//创建套接字,SOCK_STREAM为面向连接型
if(sockClient==SOCKET_ERROR)
sockcreatefail!
\n"
WSACleanup();
return(-1);
if(connect(sockClient,(structsockaddr*)&
addrServer,sizeof(addrServer))==SOCKET_ERROR)//如果请求建立连接错误
Connectfail\n"
memset(IP,0,20);
return
(1);
voidhelp()
charhelp[5];
cout<
<
typehelplistthecommand:
;
cin>
>
help;
CommandList:
endl
<
'
help'
……………………commandlist"
dir'
…………………………directorylist"
cd'
……………………………changecurrentdirectory"
pwd'
……………………………listcurrentdirectory"
get'
……………………………downloadfiles"
put'
……………………………uploadfiles"
quit'
……………………………exit!
endl;
//list作用?
voidlist(SOCKETsock)
intnRead;
while(true)
nRead=recv(sock,buf_rec,1024,0);
//从一个套接口接收数据
if(nRead==SOCKET_ERROR)
{
printf("
readresponseerror!
exit
(1);
}
if(nRead==0)//数据读取结束
break;
//显示数据
buf_rec[nRead]='
\0'
buf_rec);
intSendFile(SOCKETdatatcps,FILE*file)//SOCKETdatatcps定义变量数据连接套接字
printf("
sendingfiledata.."
for(;
)
intr=fread(buf_send,1,1024,file);
//从一个流中读数据
if(send(datatcps,buf_send,r,0)==SOCKET_ERROR)
lostthrconnectiontoclient!
closesocket(datatcps);
return0;
if(r<
1024)//文件传送结束
closesocket(datatcps);
//关闭接口
done\n"
intProcessCmd()
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(buf_rec,0,1024);
memset(buf_send,0,1024);
order;
strcat(command,order);
if(strncmp(order,"
get"
3)==0||strncmp(order,"
put"
cd"
2)==0)//有一个输入要求正确
cin>
param;
strcat(command,"
"
strcat(command,param);
command<
strcpy(buf_send,command);
if(send(sockClient,buf_send,sizeof(buf_send),0)<
0)
cout<
senddataerror!
closesocket(sockClient);
return0;
recv(sockClient,buf_rec,1024,0);
buf_rec<
if(strncmp(command,"
quit"
4)==0)
}//quit
if(strncmp(buf_rec,"
dir"
3)==0)
list(sockClient);
}//dir
2)==0){}//cd
pwd"
3)==0){}//pwd
{
fd=fopen(param,"
wb"
//使用二进制方式
if(fd==NULL)
{
printf("
openfile%sforweitefailed!
param);
return0;
}
while((count=recv(sockClient,buf_rec,1024,0))>
fwrite(buf_rec,sizeof(char),count,fd);
fclose(fd);
}//get
if(strncmp(buf_rec,"
{
strcpy(filename,buf_rec+9);
fd2=fopen(filename,"
rb"
if(fd2)
if(!
SendFile(sockClient,fd2))
{
printf("
sendfailed!
return0;
}
fclose(fd2);
else//打开文件失败
strcpy(buf_send,"
can'
topenfile!
if(send(sockClient,buf_send,1024,0))
}
}//put
closesocket(sockClient);
WSACleanup();
returnProcessCmd();
intmain()
help();
ProcessCmd();
return0;
服务器端程序清单:
#definePORT4523
SOCKETsockSrv;
//socket初始化
DWORDCreateSocket()
=0)//WSAStartup完成winsock的初始化
{printf("
socketinitializefailed!
sockSrv=socket(AF_INET,SOCK_STREAM,0);
//定义为面向连接的,返回值送给sockSrv
if(sockSrv==SOCKET_ERROR)
socketcreatefailed!
//中止WindowsSocketsDLL的使用
SOCKADDR_INaddrSrv;
//TCP/IP使用SOCKADDR_IN定义地址
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
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)
//usedtosendresponsetoclient
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!
//发送主机文件目录
intSendFileList(SOCKETdatatcps)
HANDLEhff;
WIN32_FIND_DATAfd;
//获取和更改文件属性
//搜索文件
hff=FindFirstFile("
*"
fd);
if(hff==INVALID_HANDLE_VALUE)//无效的返回值
constchar*errstr="
tlistfiles!
listfileerror!
if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR)
erroroccurswhensendingfilelist!
closesocket(datatcps);
BOOLfMoreFiles=TRUE;
while(fMoreFiles)
//发送此项文件信息
if(!
SendFileRecord(datatcps,&
fd))
//搜索下一个文件
fMoreFiles=FindNextFile(hff,&
//发送数据
intSendFile(SOCKETdatatcps,FILE*file)//发送文件
//从文件中循环读取数据并发送客户端
losttheconnectiontoclient!
DWORDProcessCmd()
if(listen(sockSrv,5)<
0)//监听信号
Listenerror!
Listeningfortherequest……\n"
SOCKADDR_INaddrclient;
//定义用于返回客户机端地址的结构
intlen=(sizeof(SOCKADDR_IN));
while
(1)
SOCKETsockconn=accept(sockSrv,(SOCKADDR*)&
addrclient,&
len);
//接受请求,产生新的套接字
if(sockconn==INVALID_SOCKET)
continue;
elseprintf("
connectingfromclient\n"
while(true)
charfilename[20];
memset(buf_rec,0,1024);
memset(buf_send,0,1024);
if(recv(sockconn,buf_rec,1024,0)<
=0)
break;
}
cout<
endl<
thecommandis:
3)!
=0&
&
strncmp(buf_rec,"
2)!
continue;
//有一个请求正确执行下面语句
strcpy(buf_send,"
dir-ing\n"
send(sockconn,buf_send,1024,0);
SendFileList(sockconn);
//发送当前所有文件名
}//dir
2)==0)
strcpy(filename,buf_rec+3);
cd-ing\n"
//发送修改目录
SetCurrentDirectory(filename);
}//cd
//获取当前目录,并放至回复报文中
if(!
GetCurrentDirectory(1024,buf_send))
pwd--can'
tgetthecurrentdirectory!
send(sockconn,buf_send,1024,0))
senderror!
}//pwd
if(strncmp(buf_rec,"
strcpy(filename,buf_rec+4);
printf(filename);
FILE*file;
//处理下载文件请求
file=fopen(filename,"
//打开下载的文件
if(file)
{
sprintf(buf_send,"
getfile%s\n"
filename);
{fclose(file);
else
{//创建额外数据连接传送数据
if(!
SendFile(sockconn,file))
return0;
fclose(file);
}//file
if(send(sockconn,buf_send,1024,0))
}//lost
}//get处理客户端的下载请求
FILE*fd;
intcount;
fd=fopen(filename,"
continue;
sprintf(buf_send,"
putfile%s"
{fclose(fd);
return0;
while((count=recv(sockconn,buf_rec,1024,0))>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件传输 协议 设计 实践
![提示](https://static.bdocx.com/images/bang_tan.gif)