《网络协议编程课程设计.docx》由会员分享,可在线阅读,更多相关《网络协议编程课程设计.docx(8页珍藏版)》请在第壹文秘上搜索。
1、海力械HUNANCITYUNIVERSITY网络协议编程课程设计说明设计题目:基于多线程的网络聊程控制台软件的设计与实现专业:网络工程学生姓名:能巫班级学号:1206102-21分组成员:1206102-06无固超1206102T8曾涛1206102-21朱江指导教师:黄雪华老师汪彦老师2015年07月03B网络协议编程课程设计报告学号:1206102-21姓名:朱江一、ttWH2015年06月29日-07月03B.二、UHHfcA湖南城市学院信息楼507机房。三、设计目的I,稳固网络协议编程课程涉及的根本知识,培养灵活运用知识进行独立设计的能力:2,掌握TCP/IP网络程序框架、Winsoc
2、kAPI,离被网络编程AP1.的使用:3、提裔嫁合运用所学的理论知识独立分析和解决何时的能力:4、迸一步熟悉利用ViSUa1.Ch6.0进行开发的能力:5、培养查阅资料.独立思考何感的能力.四,设计小忸成员1206102-06耗梆超,1206102-18白涛,1206102-21朱江。五、指Mff黄若华老师、汪彦老炖.六、羟过小殂大局部组员的讨论,决定选取选SS(票于多线程的网络聊天控制台软件的设计与实现),编写一个基于局域网的多线程控制AIro大系统。理由:1、此系统要求采用c/$模式实现,有利于进一步深刻理解和掌握这种根本的网络编程模式.2,该系统功能相对简单,易于实现,适于初学者。3,该
3、系统牵涉到Binsock编程,需要灵活运用这线知识解决实际问题,有利于培养网络系统开发的实际动手能力.七、第及关同的解决方法设计思路对于聊天程序,一般都是采用C/S模式,即效劳器/客户端的模式来设计.这样的模式有利于用户的操作和更好的用户体念.而客户端的设计主要关注与用户的体念和操作方便,其网络设计比拟简常:效劳器那么要完成大J1.t的客户控制、数据转发等操作,设计起来相对更加或杂,总体设计1!无程序是一个典型的网络程序,而网络程序的设计大多是荔子TCP/IP访议来实现的,TCP/IP协议是一个4层协议族,如图1所示.和大程序主要是依赖于传输层来实现,在传输层巾有两个St要的协议:1CP协议和
4、UDP1.W,其中TCP议(传输控制协议)是一个面向连接的协议,木协议在进行网络传输过程中首先必须建立一个平安的连按(通常是采用3次握手来实现的),UDP(用户数据指例议)是一种无连接的协议.本协议在进行数据传獭前不用建立点对点的连接.所传输的数据不会进行平安检查,如果有丢包的理思也不会曳发,本文所涉及的聊天程序采用TCP协议来实现由于每个电脑可能会有多个效劳,而傩个效劳都枭用同个IP地址来进行收发数据,所以就必须采用一种机制来实现时年个效劳的区分这就是端口,对于同一IP地址的不同端口号就代表了不同的效劳,所以对于网络聊天程序的效劳器端必须设定一个端口号,而客户端那么必须连接到效劳器掂的IP和
5、其指定的端口,如图2所示.在本文的聊天程序中,采用客户端发送数据-效劳器接收数据-效劳器转发数据-齐户培接收数据的流程来完成.由于该程序是个效劳器和多个客户端迸行新天的,所以在这我就必须注意以下几个问出效劳涔需要监控端口,以便客户的随时连接:效劳器需要监控数据流,以便随时接受来自客户端发来的数据:为了实现客户点对点的翱大,那么聘为每个客户建立一个线程.效劳=设计效劳器设计主要碓点是对多线程的设计,在这里主要涉及到三方面的内容:一是对客户端接入的监控,需要一个线程来完成;二是分别为每个客户端创立一个线程,用于收发数据,使客户端之间不会彼此干扰:三是每个客户端产生的线程对数据输入液进行监控,的时准
6、备接收数据.对于数据那么应该采用数据包的形式来进行时装,分别由发送者的地址,接收音的地址和数据何成,其中地址由昵称、IP和端口构成。当效劳器接收到该数据后,将这的数据向短个客户端都发送出去,由客户端来决定是否接收该数据所示:另外,当客户端连接到效劳器时,然向效劳器发送一个数据包.效劳器从数据包里面提取出齐户翔的地址信息和黑称,并旦根据这些信息生成一张地址信息和昵称的对照衣,且将这张去群发给每个客户:当有客户退出连接时,效劳器那么从对照表中将该客户的信息删除,并且群发该表给所有客户,该表的形式如下:地址昵称朱江客户设计对于客户箍的设计那么比效劳器简单得多主要是从界面等方便用户操作的角咬来考虑.客
7、户端主要需要完成连接效劳器、数据收发等功能,对于数据收发功能主要通过数据流来实现.八、算法及藻程加九、中试过程中出现的科及相应解决方法1 .一开始在客户端与效劳器进行通信时,只有效劳器能看见客户端的消息,而客户端看不见效劳器发的消息.之后我们发现这是因为在客户端接受消息的代码少了,在补全之后,双方都能接收信息.2 .之后我们想给这个段代码多添加一些其他的功能,首先添加时间,在此过程中我力一开始准备使/HCTimeI=CTi三e.getQrreniTi三eO;这个方法,可是除了一些我们没能解决问司,后来经过询问老师和查闻资料,最终我们使用了源程序中的获取时间的代码.十、爆程设计心1甜会课程设计是
8、培养学生媒合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的很要环节,是对学生实际工作能力的具体训练和考察过程,通过实验学习和领悟充分的熟悉了YCr的运用和操作,并坂利完成实验,增强自身团队协作意识CI客户端inc1.ude*stdafx.h*Sinc1.udeinc1.udettrag三acorrment(1ib,WS2_32.1ib*)#inc1.udeSinc1.udeSOCKETsockc1.ient;SOCkaddJinSockaddrc1.ient;charscndbuf100;chartenpbuf100;charrecvbuf100;intIen=Sizeof(SO
9、CKADDR_IN):DTORDWINAPISendProc(1.PVOIDIpParameter/threaddata);voidaai110(/*1.加载套接字创立套接字(WSAStartupO,socket()/time-ttt-time(Nu1.1.):这句返回的只是一个时间CUO1.m*t=Ioca1.timp(Stt);WoRDWVersionRequested:USDATAwsaData:interr:vVersiOnRequested=UAKEwORD(2,2):err=ISAStartup(wVersiOnRequested,ftwsa(ata);if(err!=0)retu
10、rn;)if(1.OBYTE(wsaData.Version)!=211I1IBYTE(wsaData.Version)!=2)(WSAC1.eanup();return;SOckc1.ient=SOCket(AHINET1SOCKJ)GRAH0):*2.向效劳器发送数据(sendto),/Sockaddrc1.ient.sinaddr.Sun.Saddr=inet_addr(*127.0.0.I*):Sockaddrc1.ient.sin_fai1.y=AF_INET:Sockaddrc1.ient.sin_port=htons(6000):Z/IWND1.EHsend=CreateThre
11、ad(NU1.1.,0,SendProc,NU1.1.O,NU1.1.):C1.oscHand1.e(Hsend):WhiIe(recvfro(sockc1.ient,recvbuf,100,0,(sockaddr*)ftsockaddrc1ient,&1en);if(rccvbuf)sprintf(tebuf,%ss*,inet_ntoa(sockaddrc1.ient.Sin_addr),recvbuf):printftm_year+1900.t-tmjnon+1,t-tm_mday,t-tm_hour,t-t三-sec);printfDrin1.f(飞sn”,tempbuf):/3.关闭
12、套接字。inet_ntoa()/)DttDRDWINAPISendProcC1.PVOIDIpParamcter/threaddata)uhi1.e(1.)(gets(sendbuf):sendto(sockc1.ient,sendbuf,100,0,(sockaddr*)4sockaddrc1.ient,1.en):return0;效劳器einc1.udesidafx.#inc1.udoRinc1.ude#PragBaco11me11t(1ib,*WS2_32.1.ib*)Uinc1.udesockaddrinsock;charrecvbuf100;charsendbuf10;charIeB
13、PbUfUO0;iniIen=Sizeof(sockaddr);sockaddr_inSockAddr;SOCKETServerSock:DUDRDWINAPISendProcC1.PVOIDIpParametcr/threaddata):voidain/* 1.加我套接字,创立套接字(WSAStartupO,socket()*/IieC1.Ii=Iime(NU1.1.):这句返回的只是一个时间CUOtmt=Ioca1.time(&tt);TORDWYerSiOnReqUCs1.ed;USADATAvsaData:interr:UVersionRequested=MAKEWORD(2,2);e
14、rr=SAStartu(WVersionRequested,wsaData);if(err!=O)return;)if(1.OBYTE(wsaData.wVersion)!=2H1.BYTH(wsaData.Version)=2)(WSAC1CanUP():return:ServerSock=Socket(AF_INET1SOCtDGRAM,IPPROTO.UDP):/* 2将套接字梆定到一个本地地址和端口上(bind。).* /SOCkAddr.Sit1.addr.Sun.Saddr=htoni(IMDDR-NY);SockAddr.sinfami1.y=AE_INET:SockAddr.sin_por1.=htons(6000);/Sockjddr.sin_zero-bind(ServerSnck,(sockaddr*)4SockAddrtsizeof(sockaddr_in);/3,等待接收数据Crecvfrom)/IUND1.EHsend=CreateThread(NU1.1.,0,SendProc,NU1.1.,0,NU1.1.);C1.oseHand1.e(Hsend);Vhi1.B(I)(recvfroe(ServerSock,recvbuf,100,0,(sock