FTP文件传输的设计与实现Word格式文档下载.doc

上传人:wj 文档编号:1450611 上传时间:2023-04-30 格式:DOC 页数:15 大小:335KB
下载 相关 举报
FTP文件传输的设计与实现Word格式文档下载.doc_第1页
第1页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第2页
第2页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第3页
第3页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第4页
第4页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第5页
第5页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第6页
第6页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第7页
第7页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第8页
第8页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第9页
第9页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第10页
第10页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第11页
第11页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第12页
第12页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第13页
第13页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第14页
第14页 / 共15页
FTP文件传输的设计与实现Word格式文档下载.doc_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

FTP文件传输的设计与实现Word格式文档下载.doc

《FTP文件传输的设计与实现Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《FTP文件传输的设计与实现Word格式文档下载.doc(15页珍藏版)》请在冰点文库上搜索。

FTP文件传输的设计与实现Word格式文档下载.doc

//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.输入错误指令时,客户端显示如下,显示后,无法输入任何文字

服务器显示如下

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2