ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:146.76KB ,
资源ID:6644859      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6644859.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(天大计算机网络编程实验报告1.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

天大计算机网络编程实验报告1.docx

1、天大计算机网络编程实验报告1计算机网络编程实验报告(1)一、实验要求Phase 1: Establishing Client-Server Communications 此题目需要建立Client-Server间的基于TCP套接字的通信,要求如下: (1)实现用户登录,客户端需要对密码进行加密操作,服务端对密码进行解密;(2)向服务器发送一个你想与其他用户共享的文件列表; (3)服务器与客户端之间建立通信后,允许客户端提交查询内容;(4)获得搜索结果,解析,并输出给用户; (5)客户端退出登录。2、开发环境 操作系统:Window7 编程语言:C 编译器:Visual C+ 6.03、程序流程

2、图3.1 Client端3.2 Server端4、程序详解4.1实现步骤1)实现用户登录,包括用户名和密码。客户端需要对密码进行加密操作,服务端对密码进行解密,实现简单的加密算法具体格式如下:LGINUsername# PasswordnERORMessagenLRESMessagen2)向服务器发送一个你想与其他用户共享的文件列表,用户共享信息格式如下:SHREPort#File1#File2#.#FileNnSHOKn3)服务器与客户端之间建立通信后,允许客户端提交查询内容4)服务器接收到用户的搜索请求之后,检索文件列表。如果文件列表有用户需要的文件,将搜索结果返回客户端,如果文件不存在,

3、返回错误,并通知用户他所搜索的文件不存在。SRCHSrchstringnSRESFilename#Username#IP#PortnSRESn5)用户在接收到搜索结果后,退出登录,格式如下:QUITn4.2代码分析(1)Socket初始化 WORD wVersionRequested;/定义一个WORD型数值,即其支持的最高版本的Windows Sockets调用,高阶字节指定小版本(修订本)号,低位字节指定主版本号 WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 );/配置Socket版本 err = WSAStart

4、up( wVersionRequested, &wsaData );/启动Socket if ( err != 0 ) return;/启动错误 if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup( );/ 终止Winsock 2 DLL (Ws2_32.dll) 的使用 return; SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); / 定义服务器端 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un

5、.S_addr=htonl(INADDR_ANY); / 定义为本机的IP器端 addrSrv.sin_family=AF_INET;/ 定义协议类型是INET addrSrv.sin_port=htons(6000);/ 绑定端口6000 / 将服务器端socket绑定在本地端口 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); listen(sockSrv,5); printf(Server is up:nListening.n); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); SOC

6、KET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/ 当客户端连接上来时, 拼接如下字符, accept 会阻塞进程,直到有客户端连接上来为止(2) 通信接口strcpy(sendBuf,Regist);/将文字赋值给sendBuf send(sockConn,sendBuf,strlen(sendBuf)+1,0); / 向客户端发送字符串 recv(sockConn,recvBuf,100,0);/ 获取客户端返回的数据(3) 数据结构 typedef struct User/建立线性表存储用户名和密码 char ID20;

7、char Password20;typedef struct File/建立线性表存储文件名和上传用户 char Name20; char ID20;(4) 判断用户是否注册bool IsIdUsed(User us,int len)/通过遍历用户列表来查看用户ID是否存在 for(int i=0; ilen; i+) if(strcmp(useri.ID,us.ID)=0)/判断Usi.ID与ID是否相等,相等则strcmp()值为0 return true; return false;(5)加入用户void InsertUser(User us,int len)/将用户加入线性表存储 us

8、erlen = us;(6)解析密码User getUser(char buf) User us; int i,j,tp; for(i=0,j=0; bufi!=#; i+,j+) us.IDj=bufi; us.IDj+=0; tp=buf+i-0; for(i+,j=0; bufi!=#; i+,j+) us.Passwordj=bufi+tp; us.Passwordj+=0; return us;(7)查找用户int FindUser(User us,int len)/查找用户是否存在 for(int i=0; ilen; i+) if(strcmp(us.ID,useri.ID)=0

9、&strcmp(us.Password,useri.Password)=0) return i; return -1;(8)查找文件并返回位置int FindFile(char name,int len)/查找文件是否存在并返回位置 for(int i=0; ilen; i+) if(strcmp(filei.Name,name)=0) return i; return -1;(9)添加文件void InsertFile(int len,char ID,char name )/将文件添加进线性表 strcpy(filelen.ID,ID); strcpy(filelen.Name,name);

10、 5、运行结果截图5.1注册结果5.2登录结果5.3文件分享/搜索结果5.4退出登录6、程序清单6.1 Server端#include #include #include using namespace std;typedef struct User/建立线性表存储用户名和密码 char ID20; char Password20;typedef struct File/建立线性表存储文件名和上传用户 char Name20; char ID20;User * user;File * file;bool IsIdUsed(User us,int len)/通过遍历用户列表来查看用户ID是否存在

11、 for(int i=0; ilen; i+) if(strcmp(useri.ID,us.ID)=0)/判断Usi.ID与ID是否相等,相等则strcmp()值为0 return true; return false;void InsertUser(User us,int len)/将用户加入线性表存储 userlen = us;User getUser(char buf)/解析密码 User us; int i,j,tp; for(i=0,j=0; bufi!=#; i+,j+) us.IDj=bufi; us.IDj+=0; tp=buf+i-0; for(i+,j=0; bufi!=#

12、; i+,j+) us.Passwordj=bufi+tp; us.Passwordj+=0; return us;int FindUser(User us,int len)/查找用户是否存在 for(int i=0; ilen; i+) if(strcmp(us.ID,useri.ID)=0&strcmp(us.Password,useri.Password)=0) return i; return -1;int FindFile(char name,int len)/查找文件是否存在并返回位置 for(int i=0; ilen; i+) if(strcmp(filei.Name,name

13、)=0) return i; return -1;void InsertFile(int len,char ID,char name )/将文件添加进线性表 strcpy(filelen.ID,ID); strcpy(filelen.Name,name); void main() user = (User*)malloc(100*sizeof(User);/存储空间分配 file = (File*)malloc(100*sizeof(File); while(1) int U_len=0,F_len=0; /socket初始化 WORD wVersionRequested;/定义一个WORD型

14、数值,即其支持的最高版本的Windows Sockets调用,高阶字节指定小版本(修订本)号,低位字节指定主版本号 WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 );/配置Socket版本 err = WSAStartup( wVersionRequested, &wsaData );/启动Socket if ( err != 0 ) return;/启动错误 if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 ) WSAClea

15、nup( );/ 终止Winsock 2 DLL (Ws2_32.dll) 的使用 return; SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); / 定义服务器端 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); / 定义为本机的IP器端 addrSrv.sin_family=AF_INET;/ 定义协议类型是INET addrSrv.sin_port=htons(6000);/ 绑定端口6000 / 将服务器端socket绑定在本地端口 bind(sockSr

16、v,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); listen(sockSrv,5); printf(Server is up:nListening.n); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/ 当客户端连接上来时, 拼接如下字符, accept 会阻塞进程,直到有客户端连接上来为止 char sendBuf100,recvBuf100; User NEW_USER; while(

17、1)/用户登录与注册 strcpy(sendBuf,Welcome to this server! Please choose your next action 1.regist 2.log in.n);/将字符串复制给sendBuf send(sockConn,sendBuf,strlen(sendBuf)+1,0);/发送指令 recv(sockConn,recvBuf,100,0);/接收指令 printf(Message from the client: %sn,recvBuf);/打印接收的指令 if(recvBuf0=1)/注册 strcpy(sendBuf,Regist);/将文

18、字赋值给sendBuf send(sockConn,sendBuf,strlen(sendBuf)+1,0); / 向客户端发送字符串 recv(sockConn,recvBuf,100,0);/ 获取客户端返回的数据 printf(Message from the client: %sn,recvBuf); NEW_USER=getUser(recvBuf); if(IsIdUsed(NEW_USER,U_len) strcpy(sendBuf,The User ID has already exist, please resiger again.n); send(sockConn,send

19、Buf,strlen(sendBuf)+1,0); else InsertUser(NEW_USER,U_len); U_len+; strcpy(sendBuf,Regist successful!n); send(sockConn,sendBuf,strlen(sendBuf)+1,0); else if(recvBuf0=2)/登陆 strcpy(sendBuf,Login); send(sockConn,sendBuf,strlen(sendBuf)+1,0); recv(sockConn,recvBuf,100,0); printf(Message from the client:

20、%sn,recvBuf); NEW_USER=getUser(recvBuf); if(FindUser(NEW_USER,U_len)=-1) strcpy(sendBuf,Wrong ID or password , please check it.n); send(sockConn,sendBuf,strlen(sendBuf)+1,0); else strcpy(sendBuf,Log in successful!n); send(sockConn,sendBuf,strlen(sendBuf)+1,0); break; else/错误 strcpy(sendBuf,The order

21、 is wrong!n); send(sockConn,sendBuf,strlen(sendBuf)+1,0); while(1)/文件操作菜单 strcpy(sendBuf,1.Upload File.n2.Search Filen3.Log out.n); send(sockConn,sendBuf,strlen(sendBuf)+1,0); recv(sockConn,recvBuf,100,0); printf(Message from the client: %sn,recvBuf); if(recvBuf0=1)/上传 strcpy(sendBuf,Upload); send(s

22、ockConn,sendBuf,strlen(sendBuf)+1,0); recv(sockConn,recvBuf,100,0); printf(Message from the client: %sn,recvBuf); InsertFile(F_len,NEW_USER.ID,recvBuf); F_len+; else if(recvBuf0=2)/搜索 strcpy(sendBuf,Search); send(sockConn,sendBuf,strlen(sendBuf)+1,0); recv(sockConn,recvBuf,100,0); printf(Message fro

23、m the client: %sn,recvBuf); int m=FindFile(recvBuf,F_len); if(m!=-1) strcpy(sendBuf,filem.ID); printf(Found file from %s ,sendBuf); send(sockConn,sendBuf,strlen(sendBuf)+1,0); else if(recvBuf0=3)/注销 strcpy(sendBuf,Thanks for your visiting!n); send(sockConn,sendBuf,strlen(sendBuf)+1,0); closesocket(s

24、ockConn); WSACleanup(); break; else/错误 strcpy(sendBuf,The order is wrong!n); send(sockConn,sendBuf,strlen(sendBuf)+1,0); 6.2 Client端#include #include #include #include void Ecode(char buf)/通过随机取得09的数对密码进行加密处理 srand(time(0); int tp=rand()%10,i,len=strlen(buf); buf+len=#; buf+len=0; for(i=len-2; i=1;

25、i-) bufi=bufi-1-tp; buf0=tp+0;void main() while(1) WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return;/错误启动 if ( LOBYTE( wsaData.wVersion ) != 1 |HIBYTE( wsaData.wVersion ) != 1 ) WSACleanup(

26、 ); return; SOCKET sockServer=socket(AF_INET,SOCK_STREAM,0); / 定义服务器端 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); / 绑定端口6000 connect(sockServer,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); char recvBuf100; char sendBuf100

27、; char buf100; while(1)/注册登录界面 Sleep(2000); /system(cls); recv(sockServer,recvBuf,100,0); printf(%s,recvBuf); scanf(%s,sendBuf); send(sockServer,sendBuf,strlen(sendBuf)+1,0); recv(sockServer,recvBuf,100,0); if(strcmp(recvBuf,Regist)=0) printf(Regist your ID: ); scanf(%s,sendBuf); printf(Regist your passwword: ); scanf(%s,buf); strcat(sendBuf,#); Ecode(buf); strcat(sendBuf,buf); send(sockServer,sendBuf,strlen(sendBuf)+1,0); recv(sockServer,recvBuf,100,0); printf(%s,recvBuf); else

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1