您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 广告经营 > TCP-IP课程设计
TCP/IP课程设计设计题目:基于套接字的客户机/服务器程序设计班级:学号:姓名:指导老师:年月日成绩评阅人评阅日期基于套接字的客户机/服务器程序设计一.设计目的:(1)理解客户机/服务器模型的工作原理;(2)掌握套接字的概念;(3)掌握基于套接字的面向连接和无连接客户机/服务器程序的设计原理和相关的WinSockAPI函数;(4)掌握基于TCP和UDP的程序设计方法。二.设计内容:(一)基于TCP的应用编程:编写一个Client/Server程序对,服务器程序负责接收客户机进程的连接请求,并在服务器进程与客户机进程之间建立通信连接,然后接收客户机进程的传送数据并将其显示在服务器端,同时将欢迎信息发送给客户机进程,最后关闭该客户机进程的连接;客户机进程首先提出对指定服务器的连接请求,建立连接后向服务器进程发送已经建立连接的数据信息,同时接收服务器进程发送过来的数据并显示在客户端。采用WinSockAPI实现代码。(二)基于UDP的应用编程:实现一个基于UDP的客户机/服务器程序,通过设定不同的命令行参数来确定应用进程的不同角色,即充当客户机进程还是服务器进程。当两个进程运行后,彼此之间可以轮流发送消息,对方接收后显示出来。三.原理分析:(一)套接字的概念:套接字(Socket)1.Socket的出现,使得程序员可以很方便的访问TCP/IP,从而开发各种网络应用的程序2.套接字存在于通信区域中,通信区域也叫地址族,他是一个抽象的概念,主要用于通过套接字通信的进程的共有特性综合在一起。套接字通常只与同一个区域的套接字交换数据。套接字的类型1.流式套接字(SOCK_STREAM)提供面向连接的,可靠的数据传输服务,数据无差错,无重复的发送,且按发送的顺序接收,基于TCP协议;2.数据保式套接字(SOCK_DGRAM)提供无连接的服务,数据包以独立包形式发送,不提供无错误的保证,数据可能丢失或重复,且接收顺序混乱,基于UDP协议。(二)WinSock应用程序接口:WinSock是一个基于套接字模型的API(应用程序接口),在MicrosoftWindows操作系统类中使用。它在Berkekley接口函数的基础上,还增加了基于消息驱动机制的Windows扩展函数。其中WinSock1.1只支持TCP/IP网络,WinSock2.0则增加了对更多协议的支持。WinSock包括以下3类的函数:1.WinSockAPI包含的BerkeleySocket函数。这类函数分两部分,其一是用于网络I/P的函数;其二是不涉及网络I/O,在本地端完成的函数。2.检索有关域名,通信服务和协议等Internet信息的数据库函数。3.BerkekleySocketAPI的Windows转用的扩展函数。(三)工作模型网络应用程序一般是以客户机/服务器的模型的方式工作的。而因特网便是客户机/服务器模型的一个典型应用。在这种工作方式中,一个服务器程序通常事先启动,并在一个熟知端口侦听对服务器的请求,如FTP服务器,Web服务器等。当客户机应用程序需要某种服务时,需向提供这种服务的服务器发出请求,服务器在接收到请求后,向客户机发出相应请求信息。这样客户机应用程序和服务器程序之间便建立了通信连接,此后可以进行数据通信。通信任务完成后需要关闭它们之间的通信连接。基于TCP(面向连接)和基于UDP(面向非连接)应用程序的工作流程如下所示:四.总体设计:(一)基于TCP(面向连接)的Socket编程:服务器端顺序:1.加载套接字库2.创建套接字(socket)3.将套接字绑定到一个本地地址和端口上(bind)4.将套接字设为监听模式,准备接收客户请求(listen)5.等待客户请求的到来;当请求带来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)6.用返回的套接字和客户端进行通信(send/recv)7.返回,等待另一个客户请求8.关闭套接字(closesocket)客户端程序:1.加载套接字库2.创建套接字(socket)3.向服务器发送连接请求(connect)4.和服务器端进行通信(send/receive)5.关闭套接字(closesocket)(二)基于UDP(面向无连接)的socket编程:服务器端(接收端)程序:1.加载套接字库服务器启动监听客户程序请求服务器响应请求数据通信通信连接建立通信连接关闭2.创建套接字(socket)3.将套接字绑定到一个本地地址和端口上(bind)4.等待接收数据(recvfrom)5.关闭套接字(closesocket)客户端(发送端)程序1.加载套接字库2.创建套接字(socket)3.向服务器发送数据(sendto)4.关闭套接字(closesocket)五.详细设计:(一).基于TCP的服务器/客户机程序:服务器端TCPserver.cpp:#includewinsock2.h#includeiostreamusingnamespacestd;#includestring.hvoidmain(){//加载套接字(winsock)库WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);//版本号为2.2err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup();return;}//创建套接字SOCKETsockServer=socket(AF_INET,SOCK_STREAM,0);//SOCK_STREAM参数设置为TCP连接SOCKADDR_INaddrServer;//设置服务器端套接字的相关属性addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//设置IPaddrServer.sin_family=AF_INET;addrServer.sin_port=htons(5000);//设置端口号//将套接字绑定到本地地址和指定端口上bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));//将套接字设置为监听模式,并将最大请求连接数设置成5,超过此数的请求全部作废listen(sockServer,5);SOCKADDR_INaddrClient;//用来接收客户端的设置,包括IP和端口intlen=sizeof(SOCKADDR);while(1)//不断监听{//得到创建连接后的一个新的套接字,用来和客户端进行沟通,原套接字继续监听客户的连接请求SOCKETsockConn=accept(sockServer,(SOCKADDR*)&addrClient,&len);if(sockConn!=INVALID_SOCKET)//创建成功{charsendInfo[100];//inet_ntoa将结构转换为十进制的IP地址字符串sprintf(sendInfo,welcome%stothistest!,inet_ntoa(addrClient.sin_addr));//成功建立连接后向客户端发送数据,结果将显示在客户端上send(sockConn,sendInfo,strlen(sendInfo)+1,0);//从客户端接收数据,结果显示在服务器上charrecvInfo[100];recv(sockConn,recvInfo,100,0);printf(%s\n,recvInfo);//将本次建立连接中得到套接字关闭closesocket(sockConn);}else{interrCode=WSAGetLastError();printf(theerrcodeis:%d\n,errCode);}}//如果本程序不是死循环,那么在此处还应添加以下代码:closesocket(sockServer);//对一直处于监听状态的套接字进行关闭WSACleanup();//终止对winsocket库的使用}客户端TCPclient.cpp:#includewinsock2.h#includeiostreamusingnamespacestd;#includestring.hvoidmain(){//加载套接字库WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);//版本号为2.2err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup();return;}SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);//SOCK_STREAM参数设置为TCP连接SOCKADDR_INaddrServer;//服务器地址结构addrServer.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);//服务器地址addrServer.sin_port=htons(5000);//服务器端口号addrServer.sin_family=AF_INET;//与服务器端建立连接,进行通信intconnReult=connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));if(connReult!=WSAEADDRNOTAVAIL)//访问成功{//成功建立连接后向服务器端发送数据,结果将显示在服务器端上send(sockClient,thisislisi!,strlen(thisiszhangsan!)+1,0);//接收来自服务器端发送来的信息charrecvInfo[100];recv(sockClient,recvInfo,100,0);printf(%s\n,recvInfo);}else{interrCode=WSAGetLastError();printf(theerrcodeis:%d\n,errCode);}closesocket(sockClient);WSACleanup();}(二)基于UDP的服务器/客户机程序:服务端UDPserver.cpp:#includewinsock2.h#includeiostreamusingnamespacestd;voidmain(){//加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);//版本号为2.2err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup();return;}//创建套接字//注意第二个参数和TCP设置不同SOCKETsockServer=socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_INaddrServer;//设置服务器端套接字的地址结构的相关属性addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//设置IPaddrServer.sin_family=AF_INET;addrS
本文标题:TCP-IP课程设计
链接地址:https://www.777doc.com/doc-7271090 .html