TCP_IP课程设计基于套接字的客户机服务器程序设计.doc_第1页
TCP_IP课程设计基于套接字的客户机服务器程序设计.doc_第2页
TCP_IP课程设计基于套接字的客户机服务器程序设计.doc_第3页
TCP_IP课程设计基于套接字的客户机服务器程序设计.doc_第4页
TCP_IP课程设计基于套接字的客户机服务器程序设计.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成 绩评 阅 人评阅日期TCP/IP课程设计 设计题目:基于套接字的客户机/服务器程序设计班 级: 学 号:姓 名: 指导老师: 年 月 日基于套接字的客户机/服务器程序设计一.设计目的:(1) 理解客户机/服务器模型的工作原理;(2) 掌握套接字的概念;(3) 掌握基于套接字的面向连接和无连接客户机/服务器程序的设计原理和相关的WinSock API函数;(4) 掌握基于TCP和UDP的程序设计方法。二.设计内容:(一) 基于TCP的应用编程:编写一个Client/Server程序对,服务器程序负责接收客户机进程的连接请求,并在服务器进程与客户机进程之间建立通信连接,然后接收客户机进程的传送数据并将其显示在服务器端,同时将欢迎信息发送给客户机进程,最后关闭该客户机进程的连接;客户机进程首先提出对指定服务器的连接请求,建立连接后向服务器进程发送已经建立连接的数据信息,同时接收服务器进程发送过来的数据并显示在客户端。采用WinSock API实现代码。(二) 基于UDP的应用编程:实现一个基于UDP的客户机/服务器程序,通过设定不同的命令行参数来确定应用进程的不同角色,即充当客户机进程还是服务器进程。当两个进程运行后,彼此之间可以轮流发送消息,对方接收后显示出来。三.原理分析:(一)套接字的概念:套接字(Socket) 1. Socket的出现,使得程序员可以很方便的访问TCP/IP,从而开发各种网络应用的程序 2. 套接字存在于通信区域中,通信区域也叫地址族,他是一个抽象的概念,主要用于通过套接字通信的进程的共有特性综合在一起。套接字通常只与同一个区域的套接字交换数据。 套接字的类型 1. 流式套接字(SOCK_STREAM) 提供面向连接的,可靠的数据传输服务,数据无差错,无重复的发送,且按发送的顺序接收,基于TCP协议 ;2. 数据保式套接字(SOCK_DGRAM) 提供无连接的服务,数据包以独立包形式发送,不提供无错误的保证,数据可能丢失或重复,且接收顺序混乱,基于UDP协议。(二)WinSock应用程序接口:WinSock是一个基于套接字模型的API(应用程序接口),在Microsoft Windows操作系统类中使用。它在Berkekley接口函数的基础上,还增加了基于消息驱动机制的Windows扩展函数。其中WinSock 1.1只支持TCP/IP网络,WinSock2.0则增加了对更多协议的支持。WinSock包括以下3类的函数:1.WinSock API包含的Berkeley Socket函数。这类函数分两部分,其一是用于网络I/P的函数;其二是不涉及网络I/O,在本地端完成的函数。2.检索有关域名,通信服务和协议等Internet信息的数据库函数。3.Berkekley Socket API的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:#include#includeusing namespace std;#include void main() /加载套接字(winsock)库WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); /版本号为2.2err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( ); return; /创建套接字 SOCKET sockServer=socket(AF_INET,SOCK_STREAM,0); /SOCK_STREAM参数设置为TCP连接 SOCKADDR_IN addrServer; /设置服务器端套接字的相关属性 addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /设置IP addrServer.sin_family=AF_INET; addrServer.sin_port=htons(5000); /设置端口号 /将套接字绑定到本地地址和指定端口上 bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR); /将套接字设置为监听模式,并将最大请求连接数设置成5,超过此数的请求全部作废 listen(sockServer,5); SOCKADDR_IN addrClient; /用来接收客户端的设置,包括IP和端口 int len=sizeof(SOCKADDR); while(1) /不断监听 /得到创建连接后的一个新的套接字,用来和客户端进行沟通,原套接字继续监听客户的连接请求 SOCKET sockConn=accept(sockServer,(SOCKADDR*)&addrClient, &len); if(sockConn!=INVALID_SOCKET) /创建成功 char sendInfo100; /inet_ntoa将结构转换为十进制的IP地址字符串 sprintf(sendInfo,welcome %s to this test!,inet_ntoa(addrClient.sin_addr); /成功建立连接后向客户端发送数据,结果将显示在客户端上 send(sockConn,sendInfo,strlen(sendInfo)+1,0); /从客户端接收数据,结果显示在服务器上 char recvInfo100; recv(sockConn,recvInfo,100,0); printf(%sn,recvInfo); /将本次建立连接中得到套接字关闭 closesocket(sockConn); else int errCode=WSAGetLastError(); printf(the errcode is:%dn,errCode); /如果本程序不是死循环,那么在此处还应添加以下代码: closesocket(sockServer); /对一直处于监听状态的套接字进行关闭 WSACleanup(); /终止对winsocket库的使用 客户端TCPclient.cpp:#include#includeusing namespace std;#include void main() /加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); /版本号为2.2 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( ); return; SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); /SOCK_STREAM参数设置为TCP连接 SOCKADDR_IN addrServer; /服务器地址结构 addrServer.sin_addr.S_un.S_addr=inet_addr(); /服务器地址 addrServer.sin_port=htons(5000); /服务器端口号 addrServer.sin_family=AF_INET; /与服务器端建立连接,进行通信 int connReult=connect(sockClient,(SOCKADDR*)&addrServer,sizeof(SOCKADDR); if(connReult!=WSAEADDRNOTAVAIL) /访问成功 /成功建立连接后向服务器端发送数据,结果将显示在服务器端上 send(sockClient,this is lisi!,strlen(this is zhangsan!)+1,0); /接收来自服务器端发送来的信息 char recvInfo100; recv(sockClient,recvInfo,100,0); printf(%sn,recvInfo); else int errCode=WSAGetLastError(); printf(the errcode is:%dn,errCode); closesocket(sockClient); WSACleanup(); (二)基于UDP的服务器/客户机程序:服务端UDPserver.cpp:#include #include using namespace std;void main() /加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); /版本号为2.2 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( ); return; /创建套接字 /注意第二个参数和TCP设置不同 SOCKET sockServer=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addrServer; /设置服务器端套接字的地址结构的相关属性 addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /设置IP addrServer.sin_family=AF_INET; addrServer.sin_port=htons(6000); /设置端口号 /将套接字和服务器地址结构绑定 bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); char recvBuf100; char tempBuf100; char sendBuf100; while(1) /从客户端接收数据 int result=recvfrom(sockServer,recvBuf,100,0,(SOCKADDR *)&addrClient,&len); if(result=SOCKET_ERROR) int errCode=WSAGetLastError(); printf(error:%d,errCode); break; /退出循环 else if(recvBuf0=q) /对方请求退出 /同样将退出请求发送回去 sendto(sockServer,q,strlen(q)+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR); printf(the chat end!); break; else /将对方发送过来的信息前段加上IP地址进行输出 sprintf(tempBuf,%s said:%s,inet_ntoa(addrClient.sin_addr),recvBuf); printf(%sn,tempBuf); /将用户的键盘输入发送到对方 printf(pleas input the message:n); gets(sendBuf); /得到键盘输入内容 sendto(sockServer,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR); closesocket(sockServer); WSACleanup(); 客户端UDPclient.cpp:#include #include using namespace std; void main() /加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); /版本号为2.2 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) return; if ( LOBYTE( wsaData.wVersion ) != 2 | HIBYTE( wsaData.wVersion ) != 2 ) WSACleanup( ); return; /创建套接字 SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); /注意第二个参数和TCP设置不同 SOCKADDR_IN addrServer; /服务器地址结构 addrServer.sin_addr.S_un.S_addr=inet_addr(); /服务器地址 addrServer.sin_family=AF_INET; addrServer.sin_port=htons(6000); /服务器端口号 char tempBuf100; char recvBuf100; char sendBuf100; int len=sizeof(SOCKADDR); while(1) printf(plese input the message:n); gets(sendBuf); /得到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论