嵌入式系统及应用综合实验报告格式Word文档格式.docx
《嵌入式系统及应用综合实验报告格式Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式系统及应用综合实验报告格式Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
1.项目介绍:
TFTP:
是一个服务器客户端网络程序,以提供简单文件共享服务器,支持下载,列出文件目录和上传文件功能。
QT:
是一个简单的服务器客户端聊天程序,以提供简单的数据通信。
2、设计目的:
是为提供一个可以为网络使用者提供文件共享简单的功能的使用。
方便网络间文件的访问和使用。
是一个支持双方简单聊天功能的程序。
两者都帮助我们锻炼理念知识和实践能力。
二、总体设计(含系统的总体结构、原理框图或各模块介绍等)
三、详细设计(含主要的数据结构、程序流程图、关键代码段及注释等)
(四号宋体,框图文字用小五宋体)
以下是各代码的解释,介绍,原理,流程图:
TFTP服务器:
#include<
stdio.h>
stdlib.h>
unistd.h>
string.h>
fcntl.h>
dirent.h>
sys/types.h>
/*SeeNOTES*/
sys/socket.h>
netinet/in.h>
arpa/inet.h>
errno.h>
#defineN128
typedefstructsockaddrSA;
ProcessList过程:
利用一个循环获得目录中所有的文件,并把文件名发送到客户端,最终把所有文件表发送到客户端。
完成此列出文件目录功能
voidProcessList(intconnfd)
{
charbuf[N];
DIR*mydir;
structdirent*myitem;
mydir=opendir("
."
);
while((myitem=readdir(mydir))!
=NULL)
{
if((strcmp(myitem->
d_name,"
)==0)||(strcmp(myitem->
.."
)==0))continue;
strcpy(buf,myitem->
d_name);
send(connfd,buf,N,0);
}
closedir(mydir);
return;
}
ProcessGet过程:
首先打开需要下载的客户端发来命令中的文件名文件,然后如果打开成功则向客户端发送Y,客户端准备接收,然后服务器以128为单位读取数据,发送数据,最终把一个文件所有内容发送给客户端。
完成下载功能。
voidProcessGet(intconnfd,charbuf[])
intfd,nbyte;
if((fd=open(buf+1,O_RDONLY))<
0)
fprintf(stderr,"
failtoopen%s:
%s\n"
buf+1,strerror(errno));
buf[0]='
N'
;
return;
buf[0]='
Y'
send(connfd,buf,N,0);
while((nbyte=read(fd,buf,N))>
send(connfd,buf,nbyte,0);
close(fd);
ProcessPut过程:
首先创建客户端发来命令中的文件名文件,然后如果打开成功则向客户端发送Y,客户端准备发送,客户端以128为单位读取数据,发送数据,每发送一段,服务器写入这部分内容,最终把一个文件所有内容发送给服务器。
完成上传功能。
voidProcessPut(intconnfd,charbuf[])
if((fd=open(buf+1,O_WRONLY|O_CREAT|O_TRUNC,0666))<
printf("
failtocreate%sonserver\n"
buf+1);
while((nbyte=recv(connfd,buf,N,0))>
write(fd,buf,nbyte);
Main过程:
首先初始化所有网络参数等待客户端的连接,然后以一个循环来接收客户端发来的命令首字符,并跟据这个来执行对应的操作。
intmain(intargc,char*argv[])
intlistenfd,connfd;
structsockaddr_inserver_addr;
//XXX:
step1intsocket(intdomain,inttype,intprotocol);
if((listenfd=socket(PF_INET,SOCK_STREAM,0))<
fprintf(stderr,"
failtosocket:
strerror(errno));
exit(-1);
#ifdef_DEBUG_
printf("
socketis%d\n"
listenfd);
#endif
step2intbind(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen);
memset(&
server_addr,0,sizeof(server_addr));
server_addr.sin_family=PF_INET;
server_addr.sin_port=htons(8888);
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(SA*)&
server_addr,sizeof(server_addr))<
perror("
failtobind"
exit(-1);
listen(listenfd,5);
while
(1)
if((connfd=accept(listenfd,NULL,NULL))<
{
perror("
failtoaccept"
break;
}
recv(connfd,buf,N,0);
switch(buf[0])
case'
L'
:
ProcessList(connfd);
break;
G'
ProcessGet(connfd,buf);
P'
ProcessPut(connfd,buf);
close(connfd);
return0;
TFTP客户端:
Printhelp过程:
打印所有的操作帮助。
voidPrintHelp()
help:
displayhelpinfo\n"
list:
getfilelistofserver\n"
get:
get<
file>
\n"
put:
put<
quit:
quittheclient\n"
首先利用配置好的网络参数连接服务器,然后向服务器发送“L”命令,最后利用一个循环接收目录中所有的文件名,并打印文件名,最终把所有文件表发送到客户端。
voidProcessList(structsockaddr_inserver_addr)
intsockfd,nbyte;
if((sockfd=socket(PF_INET,SOCK_STREAM,0))<
printf("
failtolist\n"
if(connect(sockfd,(SA*)&
failtoconnectserver\n"
gotoERROR_1;
strcpy(buf,"
L"
send(sockfd,buf,N,0);
while((nbyte=recv(sockfd,buf,N,0))!
=0)
%s\n"
buf);
ERROR_1:
close(sockfd);
首先利用配置好的网络参数连接服务器,然后向服务器发送“G”命令并附上需要处理的文件名,创建需要下载的命令中的文件名文件,客户端准备接收,然后服务器以128为单位读取数据,写入数据,最终把一个文件所有内容接收到客户端。
voidProcessGet(structsockaddr_inserver_addr,charcommand[])
intsockfd,nbyte,fd;
failtoget\n"