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

上传人:b****5 文档编号:6644859 上传时间:2023-01-08 格式:DOCX 页数:20 大小:146.76KB
下载 相关 举报
天大计算机网络编程实验报告1.docx_第1页
第1页 / 共20页
天大计算机网络编程实验报告1.docx_第2页
第2页 / 共20页
天大计算机网络编程实验报告1.docx_第3页
第3页 / 共20页
天大计算机网络编程实验报告1.docx_第4页
第4页 / 共20页
天大计算机网络编程实验报告1.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

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

《天大计算机网络编程实验报告1.docx》由会员分享,可在线阅读,更多相关《天大计算机网络编程实验报告1.docx(20页珍藏版)》请在冰豆网上搜索。

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

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

 

计算机网络编程实验报告

(1)

一、实验要求

Phase1:

EstablishingClient-ServerCommunications

此题目需要建立Client-Server间的基于TCP套接字的通信,要求如下:

(1)实现用户登录,客户端需要对密码进行加密操作,服务端对密码进行解密;

(2)向服务器发送一个你想与其他用户共享的文件列表;

(3)服务器与客户端之间建立通信后,允许客户端提交查询内容;

(4)获得搜索结果,解析,并输出给用户;

(5)客户端退出登录。

2、开发环境

操作系统:

Window7

编程语言:

C

编译器:

VisualC++6.0

3、程序流程图

3.1Client端

 

3.2Server端

4、程序详解

4.1实现步骤

1)实现用户登录,包括用户名和密码。

客户端需要对密码进行加密操作,服务端对密码进行解密,实现简单的加密算法具体格式如下:

LGIN

Username

#

Password

\n

EROR

Message

\n

LRES

Message

\n

2)向服务器发送一个你想与其他用户共享的文件列表,用户共享信息格式如下:

SHRE

Port

#

File1

#

File2

#

...

#

FileN

\n

SHOK

\n

3)服务器与客户端之间建立通信后,允许客户端提交查询内容

4)服务器接收到用户的搜索请求之后,检索文件列表。

如果文件列表有用户需要的文件,将搜索结果返回客户端,如果文件不存在,返回错误,并通知用户他所搜索的文件不存在。

SRCH

Srchstring

\n

SRES

Filename

#

Username

#

IP

#

Port

\n

SRES

\n

5)用户在接收到搜索结果后,退出登录,格式如下:

QUIT

\n

4.2代码分析

(1)Socket初始化

WORDwVersionRequested;  //定义一个WORD型数值,即其支持的最高版本的WindowsSockets调用,高阶字节指定小版本(修订本)号,低位字节指定主版本号

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(1,1);//配置Socket版本

err=WSAStartup(wVersionRequested,&wsaData);//启动Socket

if(err!

=0)

{

return;//启动错误

}

if(LOBYTE(wsaData.wVersion)!

=1||

HIBYTE(wsaData.wVersion)!

=1)

{

WSACleanup();//终止Winsock2DLL(Ws2_32.dll)的使用

return;

}

SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);//定义服务器端

SOCKADDR_INaddrSrv;

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(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

printf("Serverisup:

\nListening...\n");

SOCKADDR_INaddrClient;

intlen=sizeof(SOCKADDR);

SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//当客户端连接上来时,拼接如下字符,accept会阻塞进程,直到有客户端连接上来为止

(2)通信接口

strcpy(sendBuf,"Regist");//将文字赋值给sendBuf

send(sockConn,sendBuf,strlen(sendBuf)+1,0);//向客户端发送字符串

recv(sockConn,recvBuf,100,0);//获取客户端返回的数据

(3)数据结构

typedefstructUser//建立线性表存储用户名和密码

{

charID[20];

charPassword[20];

};

typedefstructFile//建立线性表存储文件名和上传用户

{

charName[20];

charID[20];

};

(4)判断用户是否注册

boolIsIdUsed(Userus,intlen)//通过遍历用户列表来查看用户ID是否存在

{

for(inti=0;i

{

if(strcmp(user[i].ID,us.ID)==0)//判断Us[i].ID与ID是否相等,相等则strcmp()值为0

returntrue;

}

returnfalse;

}

(5)加入用户

voidInsertUser(Userus,intlen)//将用户加入线性表存储

{

user[len]=us;

}

(6)解析密码

UsergetUser(charbuf[]){

Userus;

inti,j,tp;

for(i=0,j=0;buf[i]!

='#';i++,j++)

us.ID[j]=buf[i];

us.ID[j++]='\0';

tp=buf[++i]-'0';

for(i++,j=0;buf[i]!

='#';i++,j++)

us.Password[j]=buf[i]+tp;

us.Password[j++]='\0';

returnus;

}

(7)查找用户

intFindUser(Userus,intlen)//查找用户是否存在

{

for(inti=0;i

if(strcmp(us.ID,user[i].ID)==0&&strcmp(us.Password,user[i].Password)==0)

returni;

return-1;

}

(8)查找文件并返回位置

intFindFile(charname[],intlen)//查找文件是否存在并返回位置

{

for(inti=0;i

{

if(strcmp(file[i].Name,name)==0)

returni;

}

return-1;

}

(9)添加文件

voidInsertFile(intlen,charID[],charname[])//将文件添加进线性表

{

strcpy(file[len].ID,ID);

strcpy(file[len].Name,name);

}

5、运行结果截图

5.1注册结果

5.2登录结果

5.3文件分享/搜索结果

 

5.4退出登录

6、程序清单

6.1Server端

#include

#include

#include

usingnamespacestd;

typedefstructUser//建立线性表存储用户名和密码

{

charID[20];

charPassword[20];

};

typedefstructFile//建立线性表存储文件名和上传用户

{

charName[20];

charID[20];

};

User*user;

File*file;

boolIsIdUsed(Userus,intlen)//通过遍历用户列表来查看用户ID是否存在

{

for(inti=0;i

{

if(strcmp(user[i].ID,us.ID)==0)//判断Us[i].ID与ID是否相等,相等则strcmp()值为0

returntrue;

}

returnfalse;

}

voidInsertUser(Userus,intlen)//将用户加入线性表存储

{

user[len]=us;

}

UsergetUser(charbuf[])//解析密码

{

Userus;

inti,j,tp;

for(i=0,j=0;buf[i]!

='#';i++,j++)

us.ID[j]=buf[i];

us.ID[j++]='\0';

tp=buf[++i]-'0';

for(i++,j=0;buf[i]!

='#';i++,j++)

us.Password[j]=buf[i]+tp;

us.Password[j++]='\0';

returnus;

}

intFindUser(Userus,intlen)//查找用户是否存在

{

for(inti=0;i

if(strcmp(us.ID,user[i].ID)==0&&strcmp(us.Password,user[i].Password)==0)

returni;

return-1;

}

intFindFile(charname[],intlen)//查找文件是否存在并返回位置

{

for(inti=0;i

{

if(strcmp(file[i].Name,name)==0)

returni;

}

return-1;

}

voidInsertFile(intlen,charID[],charname[])//将文件添加进线性表

{

strcpy(file[len].ID,ID);

strcpy(file[len].Name,name);

}

 

voidmain()

{

user=(User*)malloc(100*sizeof(User));//存储空间分配

file=(File*)malloc(100*sizeof(File));

while

(1)

{

intU_len=0,F_len=0;

//socket初始化

WORDwVersionRequested;  //定义一个WORD型数值,即其支持的最高版本的WindowsSockets调用,高阶字节指定小版本(修订本)号,低位字节指定主版本号

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(1,1);//配置Socket版本

err=WSAStartup(wVersionRequested,&wsaData);//启动Socket

if(err!

=0)

{

return;//启动错误

}

if(LOBYTE(wsaData.wVersion)!

=1||

HIBYTE(wsaData.wVersion)!

=1)

{

WSACleanup();//终止Winsock2DLL(Ws2_32.dll)的使用

return;

}

SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);//定义服务器端

SOCKADDR_INaddrSrv;

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(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

printf("Serverisup:

\nListening...\n");

SOCKADDR_INaddrClient;

intlen=sizeof(SOCKADDR);

SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//当客户端连接上来时,拼接如下字符,accept会阻塞进程,直到有客户端连接上来为止

charsendBuf[100],recvBuf[100];

UserNEW_USER;

while

(1)//用户登录与注册

{

strcpy(sendBuf,"Welcometothisserver!

Pleasechooseyournextaction1.regist2.login.\n");//将字符串复制给sendBuf

send(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送指令

recv(sockConn,recvBuf,100,0);//接收指令

printf("Messagefromtheclient:

%s\n",recvBuf);//打印接收的指令

if(recvBuf[0]=='1')//注册

{

strcpy(sendBuf,"Regist");//将文字赋值给sendBuf

send(sockConn,sendBuf,strlen(sendBuf)+1,0);//向客户端发送字符串

recv(sockConn,recvBuf,100,0);//获取客户端返回的数据

printf("Messagefromtheclient:

%s\n",recvBuf);

NEW_USER=getUser(recvBuf);

if(IsIdUsed(NEW_USER,U_len))

{

strcpy(sendBuf,"TheUserIDhasalreadyexist,pleaseresigeragain.\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

}

else

{

InsertUser(NEW_USER,U_len);

U_len++;

strcpy(sendBuf,"Registsuccessful!

\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

}

}

elseif(recvBuf[0]=='2')//登陆

{

strcpy(sendBuf,"Login");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

recv(sockConn,recvBuf,100,0);

printf("Messagefromtheclient:

%s\n",recvBuf);

NEW_USER=getUser(recvBuf);

if(FindUser(NEW_USER,U_len)==-1)

{

strcpy(sendBuf,"WrongIDorpassword,pleasecheckit.\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

}

else

{

strcpy(sendBuf,"Loginsuccessful!

\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

break;

}

}

else//错误

{

strcpy(sendBuf,"Theorderiswrong!

\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

}

}

while

(1)//文件操作菜单

{

strcpy(sendBuf,"1.UploadFile.\n2.SearchFile\n3.Logout.\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

recv(sockConn,recvBuf,100,0);

printf("Messagefromtheclient:

%s\n",recvBuf);

if(recvBuf[0]=='1')//上传

{

strcpy(sendBuf,"Upload");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

recv(sockConn,recvBuf,100,0);

printf("Messagefromtheclient:

%s\n",recvBuf);

InsertFile(F_len,NEW_USER.ID,recvBuf);

F_len++;

}

elseif(recvBuf[0]=='2')//搜索

{

strcpy(sendBuf,"Search");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

recv(sockConn,recvBuf,100,0);

printf("Messagefromtheclient:

%s\n",recvBuf);

intm=FindFile(recvBuf,F_len);

if(m!

=-1)

{

strcpy(sendBuf,file[m].ID);

}

printf("Foundfilefrom%s",sendBuf);

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

}

elseif(recvBuf[0]=='3')//注销

{

strcpy(sendBuf,"Thanksforyourvisiting!

\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

closesocket(sockConn);

WSACleanup();

break;

}

else//错误

{

strcpy(sendBuf,"Theorderiswrong!

\n");

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

}

}

}

}

6.2Client端

#include

#include

#include

#include

voidEcode(charbuf[])//通过随机取得0~9的数对密码进行加密处理

{

srand(time(0));

inttp=rand()%10,i,len=strlen(buf);

buf[++len]='#';

buf[++len]='\0';

for(i=len-2;i>=1;i--)

buf[i]=buf[i-1]-tp;

buf[0]=tp+'0';

}

voidmain()

{

while

(1)

{

WORDwVersionRequested;

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!

=0)

{

return;//错误启动

}

if(LOBYTE(wsaData.wVersion)!

=1||HIBYTE(wsaData.wVersion)!

=1)

{

WSACleanup();

return;

}

SOCKETsockServer=socket(AF_INET,SOCK_STREAM,0);//定义服务器端

SOCKADDR_INaddrSrv;

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));

charrecvBuf[100];

charsendBuf[100];

charbuf[100];

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("RegistyourID:

");

scanf("%s",sendBuf);

printf("Registyourpasswword:

");

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