天大计算机网络编程实验报告1.docx
《天大计算机网络编程实验报告1.docx》由会员分享,可在线阅读,更多相关《天大计算机网络编程实验报告1.docx(20页珍藏版)》请在冰豆网上搜索。
天大计算机网络编程实验报告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
LRES
2)向服务器发送一个你想与其他用户共享的文件列表,用户共享信息格式如下:
SHRE
Port
File1
File2
...
FileN
SHOK
3)服务器与客户端之间建立通信后,允许客户端提交查询内容
4)服务器接收到用户的搜索请求之后,检索文件列表。
如果文件列表有用户需要的文件,将搜索结果返回客户端,如果文件不存在,返回错误,并通知用户他所搜索的文件不存在。
SRCH
Srchstring
SRES
Filename
IP
5)用户在接收到搜索结果后,退出登录,格式如下:
QUIT
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];
(4)判断用户是否注册
boolIsIdUsed(Userus,intlen)//通过遍历用户列表来查看用户ID是否存在
for(inti=0;i{if(strcmp(user[i].ID,us.ID)==0)//判断Us[i].ID与ID是否相等,相等则strcmp()值为0returntrue;}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;iif(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#includeusingnamespacestd;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()值为0returntrue;}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;iif(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);//启动Socketif(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;//定义协议类型是INETaddrSrv.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");//将字符串复制给sendBufsend(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送指令recv(sockConn,recvBuf,100,0);//接收指令printf("Messagefromtheclient:%s\n",recvBuf);//打印接收的指令if(recvBuf[0]=='1')//注册{strcpy(sendBuf,"Regist");//将文字赋值给sendBufsend(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#includevoidEcode(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);//绑定端口6000connect(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
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]!
us.Password[j]=buf[i]+tp;
us.Password[j++]='\0';
returnus;
(7)查找用户
intFindUser(Userus,intlen)//查找用户是否存在
for(inti=0;iif(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#includeusingnamespacestd;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()值为0returntrue;}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;iif(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);//启动Socketif(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;//定义协议类型是INETaddrSrv.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");//将字符串复制给sendBufsend(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送指令recv(sockConn,recvBuf,100,0);//接收指令printf("Messagefromtheclient:%s\n",recvBuf);//打印接收的指令if(recvBuf[0]=='1')//注册{strcpy(sendBuf,"Regist");//将文字赋值给sendBufsend(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#includevoidEcode(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);//绑定端口6000connect(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
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#includeusingnamespacestd;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()值为0returntrue;}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;iif(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);//启动Socketif(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;//定义协议类型是INETaddrSrv.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");//将字符串复制给sendBufsend(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送指令recv(sockConn,recvBuf,100,0);//接收指令printf("Messagefromtheclient:%s\n",recvBuf);//打印接收的指令if(recvBuf[0]=='1')//注册{strcpy(sendBuf,"Regist");//将文字赋值给sendBufsend(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#includevoidEcode(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);//绑定端口6000connect(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
if(strcmp(file[i].Name,name)==0)
(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
usingnamespacestd;
User*user;
File*file;
for(inti=0;i{if(strcmp(user[i].ID,us.ID)==0)//判断Us[i].ID与ID是否相等,相等则strcmp()值为0returntrue;}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;iif(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);//启动Socketif(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;//定义协议类型是INETaddrSrv.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");//将字符串复制给sendBufsend(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送指令recv(sockConn,recvBuf,100,0);//接收指令printf("Messagefromtheclient:%s\n",recvBuf);//打印接收的指令if(recvBuf[0]=='1')//注册{strcpy(sendBuf,"Regist");//将文字赋值给sendBufsend(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#includevoidEcode(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);//绑定端口6000connect(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
UsergetUser(charbuf[])//解析密码
for(inti=0;iif(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);//启动Socketif(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;//定义协议类型是INETaddrSrv.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");//将字符串复制给sendBufsend(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送指令recv(sockConn,recvBuf,100,0);//接收指令printf("Messagefromtheclient:%s\n",recvBuf);//打印接收的指令if(recvBuf[0]=='1')//注册{strcpy(sendBuf,"Regist");//将文字赋值给sendBufsend(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#includevoidEcode(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);//绑定端口6000connect(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
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);//启动Socketif(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;//定义协议类型是INETaddrSrv.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");//将字符串复制给sendBufsend(sockConn,sendBuf,strlen(sendBuf)+1,0);//发送指令recv(sockConn,recvBuf,100,0);//接收指令printf("Messagefromtheclient:%s\n",recvBuf);//打印接收的指令if(recvBuf[0]=='1')//注册{strcpy(sendBuf,"Regist");//将文字赋值给sendBufsend(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#includevoidEcode(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);//绑定端口6000connect(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
voidmain()
user=(User*)malloc(100*sizeof(User));//存储空间分配
file=(File*)malloc(100*sizeof(File));
while
intU_len=0,F_len=0;
//socket初始化
charsendBuf[100],recvBuf[100];
UserNEW_USER;
(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')//注册
%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");
elseif(recvBuf[0]=='2')//登陆
strcpy(sendBuf,"Login");
recv(sockConn,recvBuf,100,0);
if(FindUser(NEW_USER,U_len)==-1)
strcpy(sendBuf,"WrongIDorpassword,pleasecheckit.\n");
strcpy(sendBuf,"Loginsuccessful!
break;
else//错误
strcpy(sendBuf,"Theorderiswrong!
(1)//文件操作菜单
strcpy(sendBuf,"1.UploadFile.\n2.SearchFile\n3.Logout.\n");
if(recvBuf[0]=='1')//上传
strcpy(sendBuf,"Upload");
InsertFile(F_len,NEW_USER.ID,recvBuf);
F_len++;
elseif(recvBuf[0]=='2')//搜索
strcpy(sendBuf,"Search");
intm=FindFile(recvBuf,F_len);
if(m!
=-1)
strcpy(sendBuf,file[m].ID);
printf("Foundfilefrom%s",sendBuf);
elseif(recvBuf[0]=='3')//注销
strcpy(sendBuf,"Thanksforyourvisiting!
closesocket(sockConn);
WSACleanup();
6.2Client端
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';
WORDwVersionRequested;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
return;//错误启动
=1||HIBYTE(wsaData.wVersion)!
SOCKETsockServer=socket(AF_INET,SOCK_STREAM,0);//定义服务器端
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
connect(sockServer,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
charrecvBuf[100];
charsendBuf[100];
charbuf[100];
(1)//注册登录界面
Sleep(2000);
//system("cls");
recv(sockServer,recvBuf,100,0);
printf("%s",recvBuf);
scanf("%s",sendBuf);
send(sockServer,sendBuf,strlen(sendBuf)+1,0);
if(strcmp(recvBuf,"Regist")==0)
printf("RegistyourID:
");
printf("Registyourpasswword:
scanf("%s",buf);
strcat(sendBuf,"#");
Ecode(buf);
strcat(sendBuf,buf);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1