计算机网络课程设计.docx
- 文档编号:5259233
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:19
- 大小:289KB
计算机网络课程设计.docx
《计算机网络课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计
课程实习报告
课程名称:
计算机网络
实习题目:
文件传输协议的简单设计与实现
姓名:
系:
专业:
年级:
学号:
指导教师:
职称:
福建农林大学计算机与信息学院信息工程类
课程实习报告结果评定
评语:
成绩:
指导教师签字:
评定日期:
目录
1、实习的目的和任务……………………………………………………………4
2、实习要求………………………………………………………………………4
3、实习地点………………………………………………………………………4
4、主要仪器设备…………………………………………………………………4
5、实习内容………………………………………………………………………4
5.1设计分析………………………………………………………………4
5.2设计流程图……………………………………………………………4
5.3程序代码实现…………………………………………………………5
6、问题讨论与分析………………………………………………………………21
7、结束语…………………………………………………………………………23
文件传输协议的简单设计与实现
1.实习的目的和任务
文件传输是各种计算机网络实现的基本功能,文件传送协议是一种最基本的应用层协议。
它是按照客户/服务器的模式进行工作,建立在深入了解计算机网络是建立在TCP/IP网络体系结构之上的,并提供交式的访问。
本课程设计目的是要学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP网络应用程序基本设计方法各实现技巧。
并要求使用这些功能实现一个简单的文件传送协议。
2.实习要求
设计简单的文件传输协议,并在计算机上可实现符合其设计要求的传数据传输。
3.实习地点
福建农林大学
4.主要仪器设备(实验用的软硬件环境)
WindowsXPC++
5.实习内容
5.1设计分析
计算机网络是建立在TCP/IP网络体系结构之上,计算机除了安装TCP/IP软件外。
还安装了TCP/IP开发系统。
本实验要求设计和实现一个简单的文件传输协议,需用Socket编程接口写两个程序,分别为客户端(Client.cs)和服务端(Server.cs)。
客户端程序为文件接收端、服务器端为文件发送端。
接收端能将收到的文件保存储到机器上。
从而实现文件传输能功。
当设计程序使客户连接的时候,服务器将会向客户发回一条消息告知它的IP地址,请求添加一个用户。
然关闭连接并继续接收端口的连接。
建立各个命令功能对应的函数,发送请求,等待服务器的服务。
服务器端初始化WinSock.创建SOCKET,获取主机信息,并对客户端进行会话,发送回复讯息给客户端。
响应完毕后关闭连接,释放winSock.从而实现文件传输。
5.2设计流程图
5.3程序实现代码
客户端程序:
#include
#include
#include
usingnamespacestd;
#pragmacomment(lib,"wsock32.lib")
#definePORT4523
charbuf_send[1024];
charbuf_rec[1024];
charIP[20];
charfilename[20];
SOCKETsockClient;
SOCKADDR_INaddrServer;
DWORDCreateSock()//创建套接字
{
WSADATAWSAData;
chara[20];
memset(a,0,20);
if(WSAStartup(MAKEWORD(2,2),&WSAData)!
=0)
{printf("sockinitfail!
\n");
return(-1);
}
if(strncmp(IP,a,20)==0){
printf("pleaseinputtheIPofhost:
");
scanf("%s",&IP);}
addrServer.sin_family=AF_INET;
addrServer.sin_addr.s_addr=inet_addr(IP);
addrServer.sin_port=htons(PORT);
return1;
}
DWORDConnectServer()//连接服务器
{
sockClient=socket(AF_INET,SOCK_STREAM,0);
if(sockClient==SOCKET_ERROR)
{
printf("sockcreatefail!
\n");
WSACleanup();
return(-1);
}
if(connect(sockClient,(structsockaddr*)&addrServer,sizeof(addrServer))==SOCKET_ERROR)
{
printf("Connectfail\n");
memset(IP,0,20);
return(-1);
}
return
(1);
}
voidhelp()
{
charhelp[5];
cout<<"type?
orhelplistthecommand:
";
cin>>help;
cout<<"@*@*@*@*@*@*@*@*@*@*@CommandList@*@*@*@*@*@*@*@*@*@*@"< <<"'? 'or'help'……………………commandlist"< <<"'dir'…………………………directorylist"< <<"'cd'……………………………changecurrentdirectory"< <<"'pwd'……………………………listcurrentdirectory"< <<"'get'……………………………downloadfiles"< <<"'put'……………………………uploadfiles"< <<"'quit'……………………………exit! "< <<"@*@*@*@*@*@*@*@*@*@*@@*@*@*@*@*@*@*@*@*@*@@*@*@*@*@*@*@"< } voidlist(SOCKETsock) { intnRead; while(true) { nRead=recv(sock,buf_rec,1024,0); if(nRead==SOCKET_ERROR) { printf("readresponseerror! \n"); exit (1); } if(nRead==0)//数据读取结束 break; //显示数据 buf_rec[nRead]='\0'; printf("%s",buf_rec); } } intSendFile(SOCKETdatatcps,FILE*file) { printf("sendingfiledata.."); for(;;) //从文件中循环读取数据并发送客户端 { intr=fread(buf_send,1,1024,file); if(send(datatcps,buf_send,r,0)==SOCKET_ERROR) { printf("lostthrconnectiontoclient! \n"); closesocket(datatcps); return0; } if(r<1024)//文件传送结束 break; } closesocket(datatcps); printf("done\n"); return1; } intProcessCmd() { intcount; charorder[10]; charparam[20]; charcommand[30]; FILE*fd; FILE*fd2; command[0]='\0'; CreateSock(); ConnectServer(); //returnmain; //cout<<"connectOK"< cout<<"pleaseinputorder: "< memset(order,0,10); memset(param,0,20); memset(command,0,30); memset(buf_rec,0,1024); memset(buf_send,0,1024); cin>>order; strcat(command,order); if(strncmp(order,"get",3)==0||strncmp(order,"put",3)==0||strncmp(order,"cd",2)==0) { cin>>param; strcat(command,""); strcat(command,param); } cout< strcpy(buf_send,command); if(send(sockClient,buf_send,sizeof(buf_send),0)<0) { cout<<"senddataerror! "< closesocket(sockClient); WSACleanup(); return0; } if(strncmp(command,"quit",4)==0) { closesocket(sockClient); WSACleanup(); return0; }//quit recv(sockClient,buf_rec,1024,0); cout< if(strncmp(buf_rec,"dir",3)==0) { list(sockClient); }//dir if(strncmp(order,"cd",2)==0){}//cd if(strncmp(order,"pwd",3)==0){}//pwd if(strncmp(buf_rec,"get",3)==0) { fd=fopen(param,"wb");//使用二进制方式 if(fd==NULL) { printf("openfile%sforweitefailed! \n",param); return0; } while((count=recv(sockClient,buf_rec,1024,0))>0){ fwrite(buf_rec,sizeof(char),count,fd);} fclose(fd); }//get if(strncmp(buf_rec,"put",3)==0) { 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! \n"); if(send(sockClient,buf_send,1024,0)) return0; } }//put closesocket(sockClient); WSACleanup(); returnProcessCmd(); } intmain() { help(); ProcessCmd(); return0; } 服务器端: #include #include #include usingnamespacestd; #pragmacomment(lib,"wsock32.lib") #definePORT4523 charbuf_send[1024]; charbuf_rec[1024]; SOCKETsockSrv; //socket初始化 DWORDCreateSocket() { WSADATAWSAData; if(WSAStartup(MAKEWORD(2,2),&WSAData)! =0) {printf("socketinitializefailed! \n"); return(-1); } sockSrv=socket(AF_INET,SOCK_STREAM,0); if(sockSrv==SOCKET_ERROR) { printf("socketcreatefailed! \n"); WSACleanup(); return(-1); } SOCKADDR_INaddrSrv; 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) { printf("BindError"); return(-1); } return (1); } intSendFileRecord(SOCKETdatatcps,WIN32_FIND_DATA*pfd) //usedtosendresponsetoclient { charfilerecord[MAX_PATH+32]; FILETIMEft; FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft); SYSTEMTIMElastwtime; FileTimeToSystemTime(&ft,&lastwtime); 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"; printf("listfileerror! \n"); if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR) { printf("erroroccurswhensendingfilelist! \n"); } closesocket(datatcps); return0; } BOOLfMoreFiles=TRUE; 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) { printf("Listenerror! "); return(-1); } printf("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< "< if(strncmp(buf_rec,"dir",3)! =0&&strncmp(buf_rec,"get",3)! =0&&strncmp(buf_rec,"put",3)! =0&&strncmp(buf_rec,"pwd",3)! =0&&strncmp(buf_rec,"cd",2)! =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,"cd",2)==0) { strcpy(filename,buf_rec+3); strcpy(buf_send,"cd-ing\n"); send(sockconn,buf_send,1024,0); SetCurrentDirectory(filename); continue; }//cd if(strncmp(buf_rec,"pwd",3)==0) { //获取当前目录,并放至回复报文中 if(! GetCurrentDirectory(1024,buf_send)) strcpy(buf_send,"pwd--can'tgetthecurrentdirectory! \n"); if(! send(sockconn,buf_send,1024,0)) printf("senderror! "); continue; } if(strncmp(buf_rec,"get",3)==0) { strcpy(filename,buf_rec+4); printf(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//打开文件失败 { strc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计