FTP文件传输的设计与实现.doc
- 文档编号:230618
- 上传时间:2022-10-07
- 格式:DOC
- 页数:15
- 大小:335KB
FTP文件传输的设计与实现.doc
《FTP文件传输的设计与实现.doc》由会员分享,可在线阅读,更多相关《FTP文件传输的设计与实现.doc(15页珍藏版)》请在冰豆网上搜索。
附件:
程序代码
服务器源代码:
#include
#include
#include
usingnamespacestd;
#pragmacomment(lib,"wsock32.lib")
#definePORT4523
charbuf_send[1024];
charbuf_rec[1024];
SOCKETsockSrv;
//socket初始化
DWORDCreateSocket()
{
WSADATAWSAData;//WSADATA结构被用来保存函数WSAStartup返回的WindowsSockets初始化信息
if(WSAStartup(MAKEWORD(2,2),&WSAData)!
=0)//WSAStartup完成winsock的初始化
{printf("socketinitializefailed!
\n");
return(-1);
}
sockSrv=socket(AF_INET,SOCK_STREAM,0);//定义为面向连接的,返回值送给sockSrv
if(sockSrv==SOCKET_ERROR)
{
printf("socketcreatefailed!
\n");
WSACleanup();//中止WindowsSocketsDLL的使用
return(-1);
}
SOCKADDR_INaddrSrv;//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)
{
printf("BindError");
return(-1);
}
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?
"
"";
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("Erroroccurswhensendingfilelist!
\n");
return0;
}
return1;
}
//发送主机文件目录
intSendFileList(SOCKETdatatcps)
{
HANDLEhff;
WIN32_FIND_DATAfd;//获取和更改文件属性
hff=FindFirstFile("*",&fd);//搜索文件
if(hff==INVALID_HANDLE_VALUE)//搜索无效返回值
{
constchar*errstr="can'tlistfiles!
\n";
cout<<"listfileerror!
"< if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR) { cout<<"erroroccurswhensendingfilelist! "< } closesocket(datatcps); return0; } BOOLfMoreFiles=TRUE;//BOOL型,返回值为大于0的整数时为TRUE,返回值为0时候,为FALSE,返回值为-1时为ERROR。 while(fMoreFiles) { //发送此项文件信息 if(! SendFileRecord(datatcps,&fd))//发送失败 { closesocket(datatcps); return0; } //搜索下一个文件 fMoreFiles=FindNextFile(hff,&fd); } closesocket(datatcps); return1; } //发送数据 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! \n"); closesocket(datatcps); return0; } if(r<1024)//文件传送结束 break; } closesocket(datatcps); printf("done\n"); return1; } DWORDProcessCmd() { if(listen(sockSrv,5)<0)//监听信号 { cout<<"Listenerror! "< return(-1); } 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; } cout< "< if(strncmp(buf_rec,"dir",3)! =0&&strncmp(buf_rec,"get",3)! =0&&strncmp(buf_rec,"put",3)! =0) continue;//有一个请求正确执行下面语句 if(strncmp(buf_rec,"dir",3)==0) { strcpy(buf_send,"dir-ing\n"); send(sockconn,buf_send,1024,0); SendFileList(sockconn);//发送当前所有文件名 }//dir if(strncmp(buf_rec,"get",3)==0) { strcpy(filename,buf_rec+4); cout< 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,"can'topenfile! \n"); if(send(sockconn,buf_send,1024,0)) return0; } }//get处理客户端的下载请求 if(strncmp(buf_rec,"put",3)==0) { FILE*fd; intcount; strcpy(filename,buf_rec+4); fd=fopen(filename,"wb"); if(fd==NULL) { printf("openfile%sforweitefailed! \n",filename); continue; } sprintf(buf_send,"putfile%s",filename); if(! send(sockconn,buf_send,1024,0)) { fclose(fd); return0; } while((count=recv(sockconn,buf_rec,1024,0))>0) fwrite(buf_rec,sizeof(char),coun
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FTP 文件传输 设计 实现