资源描述:
《吴尚_计算机网络编程实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、计算机网络编程实验报告学院计算机学院专业计算机科学与技术年级2010级姓名吴尚学号30102160802012年4月25日Phase1:EstablishingClient-ServerCommunications1.题目要求此题目要求利用TCP套接字编程建立一个服务端与客户端进行通信的网络,在建立TCP连接的基础上实现报文的交换以及报文的处理。在本实验中,要利用TCP套接字编程在集中式的P2P网络架构中建立一个P2P客户端,其中由一个中心服务器负责保存并维护整个网络中的文件。当一个用户想要在网络中搜索一
2、个文件,只需要向中心服务器发送一个请求,服务器在中心数据库中运行请求,并返回文件及其所在位置的列表。用户可以指定想要下载的文件,与该文件拥有者的连接就会被打开。本阶段P2P的客户端要与P2P的服务端进行交互,并实现以下5个主要功能:1.服务器验证(提供用户名和加密的密码)2.将想要分享给其他用户的文件列表发送给服务器3.发送请求给服务器,搜索想要下载的一个文件。4.服务器接收请求并解析,将搜索结果反馈给用户。5.登出。2.开发环境操作系统:WindowsXP编程语言:C++编译环境:MicrosoftVi
3、sualC++6.03.程序详解3.1服务器端程序描述3.1.1基本功能此部分主要包括完成网络通信所必要的服务器端的基本功能,主要的功能函数包括:(1)WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);这个函数用来创建一个原始的套接字,使用时需要包含winsock2.h头文件和链接wsock32.lib库。(2)bind(listenSocket,(SOCKADDR*)&saServer,sizeof(SOCKADD
4、R));这个函数主要实现了将本地地址与套接口进行捆绑。(3)listen(listenSocket,10);这个函数用于监听用户的连接请求。第二个参数是你监听客户端的最大个数,如连接到主机上的客户端超过其数listen则会返回一个错误代号。3.1.2多线程的创建CreateThread(NULL,0,AcceptThread,(LPVOID)sIP,0,&tcpThreadId);这个函数将在主线程的基础上建立一个新的线程,用于连接多个客户端。DWORDWINAPIAcceptThread(LPVOIDl
5、pParam);这个函数用来接收用户线程的一系列操作。3.1.3用户登录验证boolCheckLogin(charrecvbuf[]){charcode;intcodenum;if(recvbuf[0]!='L'
6、
7、recvbuf[1]!='G'
8、
9、recvbuf[2]!='I'
10、
11、recvbuf[3]!='N')returnfalse;if(recvbuf[4]!='j'
12、
13、recvbuf[5]!='e'
14、
15、recvbuf[6]!='r'
16、
17、recvbuf[7]!='r'
18、
19、recvbuf[8]!='y
20、')returnfalse;inti=4;while(recvbuf[i]!='#')i++;i++;codenum=(int)recvbuf[i]-48;intstart=++i;while(recvbuf[i]!='')i++;i--;intend=i;Decode(recvbuf,start,end,codenum);i=start;if(recvbuf[i]!='t'
21、
22、recvbuf[i+1]!='c'
23、
24、recvbuf[i+2]!='p')//密码为tcpreturnfalse;retur
25、ntrue;}这个函数用来验证即将登陆用户的用户名和密码是否正确。实现方法如下:首先检查recvbuf头部是否为"LGIN",然后检查用户名是否匹配。检查成功后,调用decode()函数将用户发来的密文解密,再验证密码时是否正确。以上过程均成功后,返回true,否则返回false。voidDecode(charmessage[],intstart,intbegin,intcodenum){for(inti=start;i<=begin;i++)message[i]+=codenum;}此函数用来解密用户发
26、来的密文部分。首先从头部解析密钥,然后根据密钥将暗文转换为明文。用户名为“jerry”,密码为“tcp”。3.1.4接收上传文件voidSaveToMem(charrecvbuf[],CStringclientIP){charportChar[10]="";inti=4;for(;recvbuf[i]!='#';i++)portChar[i-4]=recvbuf[i];CStringport;port.Format("%s",