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