Linux文件传输系统2Word文档格式.docx
《Linux文件传输系统2Word文档格式.docx》由会员分享,可在线阅读,更多相关《Linux文件传输系统2Word文档格式.docx(27页珍藏版)》请在冰点文库上搜索。
检查用户是否已登陆,如登录,显示登录用户。
④消息处理:
解析客户端与服务器端的消息交互类型,并做出相应处理,能够找到消息所对应的接收端。
⑤监听作用:
实现对服务器发送过来的消息进行监听的功能;
2)客户端:
主要实现向服务器端发布消息,并且对来自服务器的消息做出相应的响应。
具体功能如下:
①连接功能:
输入服务器地址,实现登录及断开功能
②登录设置:
登录时,发送消息使服务器端获得相关登录信息。
③消息处理:
接收由服务器端发送来的信息,并做出相应的响应;
相应从服务器端接收到的消息交互类型,实现用户与用户之间的信息交互和文件交互;
⑤文件上传,下载:
实现文件上传,下载以及查看服务器下默认的文件列表等。
Ⅲ详细设计
3.1软件层次模型
服务器层次结构:
客户端层次结构:
3.2流程图
根据以上的程序模块划分,设计好服务器端和客户端的流程图,如下:
服务器端流程:
客户端流程:
Ⅳ编程以及运行结果
4.1服务器
1.进入服务器,等待连接。
intmain(intargc,char**argv)
{
printf("
\n欢迎来到张驹强,李欢和谭建的FTP服务器\n"
);
//gettheserversocket
server_sock=socket(PF_INET,SOCK_STREAM,0);
if(server_sock==-1)//createsocketfailed
{
请求socket创建失败\n"
exit(-1);
}
elseprintf("
请求socket创建成功!
\n"
//configureserveraddress,port
memset(&
server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SERVER_PORT);
//server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_addr.s_addr=inet_addr("
127.0.0.1"
if(server_addr.sin_addr.s_addr==INADDR_NONE)
IP地址错误!
server_adr_len=sizeofserver_addr;
//bind
z=bind(server_sock,(structsockaddr*)&
server_addr,server_adr_len);
if(z==-1)
绑定失败!
绑定成功!
//listen
z=listen(server_sock,5);
if(z<
0)
服务器无法监听!
"
exit
(1);
服务器开始监听\n"
//loopandwaitforconnection
while
(1)
//structsockaddr_inclient_addr;
client_addr_len=sizeof(client_addr);
i=0;
等待连接请求...\n"
//acceptanrequest
while
(1){
pthread_tthread;
client_sock=accept(server_sock,(structsockaddr*)&
client_addr,&
client_addr_len);
if(client_sock<
0){
printf("
请求出错!
\n"
);
continue;
}
//实现服务器多线程操作
if((pthread_create(&
thread,NULL,handleFunc,&
client_sock))!
=0){
printf("
创建线程失败!
break;
}
close(server_sock);
return0;
}
2.建立连接。
voidcommand_port(char*params,char*reply)
unsignedlonga0,a1,a2,a3,p0,p1,addr;
sscanf(params,"
%lu,%lu,%lu,%lu,%lu,%lu"
&
a0,&
a1,&
a2,&
a3,&
p0,&
p1);
addr=htonl((a0<
<
24)+(a1<
16)+(a2<
8)+a3);
if(addr!
=client_addr.sin_addr.s_addr)
stpcpy(reply,"
数据传输socket请求IP地址错误!
return;
//setuptheportforthedataconnection
data_addr,0,sizeof(data_addr));
data_addr.sin_family=AF_INET;
data_addr.sin_addr.s_addr=addr;
data_addr.sin_port=htons((p0<
8)+p1);
//getthedatacocket
data_sock=socket(PF_INET,SOCK_STREAM,0);
if(data_sock==-1)
数据传输socket创建失败!
无法创建数据传输socket\r\n"
//connecttotheclientdatasocket
if(connect(data_sock,(structsockaddr*)&
data_addr,sizeof(data_addr))<
数据传输socket连接失败!
\r\n"
双方连接建立成功!
3.显示登录信息。
if(strcmp(command,"
USE"
)==0)//USER
stpcpy(reply,"
suc\r\n"
write(clifd,reply,strlen(reply));
printf("
%s进入服务器\n"
buffer+4);
continue;
4.创建文件。
if(stat(filename,&
sbuf)==-1)
//printf("
创建文件失败.\n"
outfile=fopen(filename,"
w"
if(outfile==0)
创建文件失败\r\n"
close(data_sock);
5.删除文件。
voidcommand_delete(charfilename[],char*reply){
inti=remove(filename);
if(i<
0)
删除失败,可能由于目标文件不存在\r\n"
else
删除成功\r\n"
6.重命名文件。
voidcommand_rename(charfilename[],charnewname[],char*reply){
%s\n"
filename);
newname);
inti=rename(filename,newname);
重命名失败,可能由于目标文件不存在\r\n"
重命名成功\r\n"
7.显示当前目录。
voidcommand_list(char*reply)
intn=0;
charinfo[MAX_INPUT_SIZE];
charbuf[MAX_INPUT_SIZE];
stpcpy(buf,"
DIR*mydir;
structdirent*myitem;
mydir=opendir("
."
while((myitem=readdir(mydir))!
=NULL)
if((strcmp(myitem->
d_name,"
)==0)||(strcmp(myitem->
.."
)==0))
stpcpy(info,myitem->
d_name);
strcat(info,"
\t"
strcat(buf,info);
n++;
if(n==4){
strcat(buf,"
n=0;
closedir(mydir);
stpcpy(reply,buf);
上图为服务器端运行结果。
4.2客户端
1.建立连接。
server_ip=LOCAL_IP;
server_port=SERVER_PORT;
//connecttotheftpserver
server_host=gethostbyname(server_ip);
if(server_host==(structhostent*)NULL)
>
gethostbynamefailed\n"
//setuptheportfortheconnection
server_addr,0,sizeof(server_addr));
memcpy(&
server_addr.sin_addr,server_host->
h_addr,server_host->
h_length);
server_addr.sin_port=htons(server_port);
//getthesocket
if(server_sock<
erroronsocket()\n"
//connecttotheserver
if(connect(server_sock,(structsockaddr*)&
server_addr,sizeof(server_addr))<
erroronconnect()\n"
//connecttotheftpserversuccessful
连接到%s:
%d\n"
server_ip,server_port);
user_login();
help_info();
2.连接到服务器。
voiduser_login()
用户名称:
fgets(line_in,MAX_INPUT_SIZE,stdin);
line_in[strlen(line_in)-1]='
\0'
;
stpcpy(name,line_in);
send_msg("
USER"
line_in,1);
z=read(server_sock,buffer,sizeof(buffer));
buffer);
buffer[z-2]=0;
if(strncmp("
suc"
buffer,3)==0)
欢迎来到FTP:
name);
请选择操作\n"
else{
被服务器拒绝\n"
3.帮助界面。
voidhelp_info()
?
orhelp\t获得帮助信息\n"
ls\t获得当前目录下的文件\n"
pwd\t获得当前路径\n"
cd\t修改路径(需要高级权限)\n"
get<
文件名>
\t下载数据\n"
put<
\t上传数据\n"
apply<
密码>
\t申请高级权限\n"
rename<
\t修改服务器中的中文名(需要高级权限)\n"
rm\t删除服务器中的文件(需要高级权限)\n"
quit\t退出FTP\n"
4.获得服务器当前路径。
voidcommand_pwd()
PWD"
name,0);
buffer);
5.修改路径。
voidcommand_cd()
CWD"
line_in[3],1);
6.传输文件。
intcommand_port()
if(client_sock<
structsockaddr_inlocal_addr;
socklen_tlocal_addr_len=sizeoflocal_addr;
local_addr,0,sizeoflocal_addr);
if(getsockname(server_sock,(structsockaddr*)&
local_addr,&
local_addr_len)!
=0)
获得本地ip地址失败\n"
return-1;
local_ip=inet_ntoa(local_addr.sin_addr);
local_port=local_addr.sin_port;
localaddr%s:
local_ip,local_port);
charclient_port[8]="
sprintf(client_port,"
%d.%d"
(int)(local_port/256),(int)(1+local_port-256*(int)(local_port/256)));
sprintf(port_addr,"
%s.%s"
local_ip,client_port);
replace(port_addr,"
"
"
24);
if(data_conn(local_ip,local_port+1)==-1)return-1;
}
PORT"
port_addr,1);
socklen_tdata_addr_len=sizeofdata_addr;
data_addr,0,sizeofdata_addr);
data_sock=accept(client_sock,(structsockaddr*)&
data_addr,&
data_addr_len);
if(data_sock<
传输数据socket创建失败!
intdata_conn(char*ip,intport)
client_sock=socket(PF_INET,SOCK_STREAM,0);
if(client_sock==-1)//createsocketfailed
close(client_sock);
client_addr,0,sizeof(client_addr));
socklen_tclient_addr_len=sizeofclient_addr;
client_addr.sin_family=AF_INET;
client_addr.sin_port=htons(port);
//client_addr.sin_addr.s_addr=htonl(INADDR_ANY);
client_addr.sin_addr.s_addr=inet_addr(ip);
if(client_addr.sin_addr.s_addr==INADDR_NONE)
IP地址错误\n"
z=bind(client_sock,(structsockaddr*)&
client_addr,client_addr_len);
perror("
传输数据socket绑定失败\n"
z=listen(client_sock,1);
传输数据socket监听失败!
传输数据socket正在监听...\n"
7.申请权限。
voidcommand_apply(char*code){
APPL"
code,1);
if(strncmp(buffer,"
Y"
1)==0)
p=1;
send_msg("
APSU"
name,1);
权限申请成功\n"
}else{
p=0;
权限申请失败\n"
8.删除服务器下的文件。
voidcommand_delete(char*filename){
if(strlen(filename)==0)
{
prin