《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《TCP IP协议与网络编程》课件第7章 TCP网络程序框架与实例.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TCP IP协议与网络编程 TCP IP协议与网络编程课件第7章 TCP网络程序框架与实例 TCP IP 协议 网络 编程 课件 程序 框架 实例
- 资源描述:
-
1、第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.1 7.1 网络应用程序的基本工作流程网络应用程序的基本工作流程7.2 7.2 基于基于TCPTCP的客户的客户/服务器通信程序实例服务器通信程序实例7.3 7.3 基于基于UDPUDP的客户与服务器通信程序实例的客户与服务器通信程序实例习题习题 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.1 网络应用程序的基本工作流程网络应用程序的基本工作流程7.1.1 面向连接的客户/服务器程序工作流程1服务器端程序工作流程工作时,在服务器端的应用程序应该首先启动
2、,以等待客户的服务请求。其工作流程如下:(1)使用WSAStartup()函数检查系统协议栈的安装情况。只有在协议栈正确安装的情况下,才可以执行以下的各步骤。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例常用的调用格式有如下两种:WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);注意,这里所使用的Winsock为2.2版,也可以使用其他版本的Winsock。(2)使用socket()或WSASocket()函数创建服务器端通信的套接口。如果套接口创建不成功,也不能执行以下的各步操作,并且要调用WSACl
3、eanup()函数,结束Windows Sockets API的使用。这一步调用过程确定了相关五元组的协议。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例常用的调用格式有如下几种:SOCKET serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);SOCKET serverSocket=socket(AF_INET,SOCK_STREAM,0);SOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);SOC
4、KET serverSocket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);注意,调用不成功时返回INVALID_SOCKET。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(3)使用bind()函数将创建的套接口与服务器地址绑定。它确定了相关五元组中的本地IP地址和端口号。常用调用格式如下:b i n d(s e r v e r S o c k e t,(c o n s t s t r u c t sockaddr*)&localaddr,sizeof(sockaddr);bind(serverSoc
5、ket,(SOCKADDR*)&localaddr,sizeof(sockaddr);bind(serverSocket,(sockaddr*)&localaddr,sizeof(sockaddr);bind(serverSocket,(LPSOCKADDR)&localaddr,sizeof(sockaddr);注意,本机地址有多种表示方法,它们是等价的。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(4)使用listen()函数使服务器套接口做好接收连接请求的准备。该函数的调用格式如下:listen(serverSocket,queuelen);注意,第二个参数是请求队列的长
6、度,用以限制排队请求的客户数,它与协议的实现有关,一般给queuelen赋值为5。(5)使用accept()或WSAAccept()函数接收来自客户端由connect()发出的连接请求。常用格式如下:SOCKET Newsock=accept(serverSocket,(struct sockaddr*)&clientaddr,&clientaddr_len);在该函数的参数中,由clientaddr参数返回客户端协议、IP地址和端口信息。至此,一个通信所需的五元组已建立。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(6)根据连接请求建立连接后,使用send()或WSASend
7、()函数发送数据,或使用recv()或WSARecv()函数接收数据。调用方法见后面的实例。(7)使用closesocket()函数关闭套接口。它的使用方法如下:closesocket(serverSocket);(8)最后调用WSACleanup()函数,结束Windows Sockets API的使用。它是一个无参函数,在程序中直接调用即可,即WSACleanup();至此,服务器的工作过程结束。当然实际的服务器程序是比较复杂的,这里只是对它的基本流程进行了说明。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例2客户端程序工作流程客户端相对服务器端来说,其工作过程较为简单。客户
8、端应用程序的工作流程如下:(1)使用WSAStartup()函数检查系统协议栈的安装情况。其调用格式与服务器端是相同的,即WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(2)使用socket()或WSASocket()函数创建客户端套接口。其调用格式同服务器端是一样的,即:SOCKET clientSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);(3)使用connect()或WSAConnect()函数发出与
9、服务器建立连接的请求。常用格式如下:c o n n e c t(c l i e n t S o c k e t,(s t r u c t sockaddr*)&serveraddr,sizeof(serveraddr);第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例如果客户想连接的计算机没有监听指定端口的进程,则请求连接的connect()调用就会失败,并发生代码为WSAECONNREFUSED的错误。另一种常见的错误代码是WSAETIMEDOUT,这种情况一般发生在试图连接的计算机不能用时,如客户与要连接的服务器之间路由不通、服务器主机硬件故障或者服务器不在网络上等。注意,se
10、rveraddr参数是指向远程服务器地址的一个指针,因此要调用此函数前一定要知道远程服务器的地址和端口号,并把其值赋给serveraddr结构量,否则无法使用该函数。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例 (4)连接建立后,使用send()或WSASend()函数发送数据,或使用recv()或WSARecv()函数接收数据。(5)使用closesocket()函数关闭套接口。(6)最后调用WSACleanup()函数,结束Windows Sockets API的使用。至此,一次客户向服务器请求服务的过程结束。3服务器与客户端五元组的建立第6章我们讨论过服务器与客户通信的过
11、程要用一个五元组来标识。这个五元组是:第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)对于面向连接的(TCP协议)通信来说,服务器与客户之间的连接建立完成后,这个五元组就建立了,如表7-1所示。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例表7-1 面向连接的通信过程中五元组的建立 五元组 服务器端五元组 由 socket()确定 由服务器端调用 bind()时确定 由 accept()确定 客户端五元组 由 socket()确定 由客户端的 bind()调用确定。如果客户端没有进行 bind()调用,或调用
12、了 bind()但没有指定具体地址或端口,则由系统内核自动确定地址和 端口 由 connect()确定 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例4服务器与客户通信过程模型图 服务器与客户进行上述通信的过程可以用图7-1表示。要注意的是,在客户端也可以使用bind()调用进行地址绑定。图7-1中数据的交换部分在实际程序中有多种可能性,图中只给出了一种服务器端先接收数据然后再发送数据的情况。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例WSAStartup()socket()bind()listen()accept()等待客户连接请求的到来recv()send()
13、closesocket()WSACleanup()用三次握手过程建立TCP连接send()recv()closesocket()WSACleanup()关闭TCP连接交换数据交换数据connect()socket()WSAStartup()图7-1 面向连接的客户/服务器程序工作模型 第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.1.2 无连接的客户/服务器程序工作流程无连接的数据报(SOCK_DGRAM)传输服务在传输层使用UDP协议。与面向连接的通信过程不同,它的最大特点是不需要在客户和服务器之间先建立连接,通信的任何一方可以先发送数据,这样首先发送数据的一方就成了客户端
14、,而接收数据的一方就是服务器端。在数据传输完成后,只要关闭套接口,释放网络资源,通信过程就结束了。无连接的数据报传输服务通信时,客户端与服务器端所使用的函数是类似的。其工作流程如下:第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(1)使用WSAStartup()函数检查系统协议栈的安装情况。使用格式为:WSAStartup(0 x0202,&wsaData);WSAStartup(MAKEWORD(2,2),&wsaData);(2)使用socket()或WSASocket()函数创建套接口,以确定相关五元组的协议。调用格式有如下几种:SOCKET s=socket(AF_INE
15、T,SOCK_DGRAM,IPPROTO_UDP);SOCKET s=socket(AF_INET,SOCK_DGRAM,0);SOCKET第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例s=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);SOCKET s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(3)使用bind()函数将创建的套接口与本地地址绑定。它确定
16、了相关五元组中的本地IP地址和端口号。常用格式如下:bind(s,(const struct sockaddr*)&localaddr,sizeof(sockaddr);(4)使用sendto()或WSASendTo()函数发送数据,使用recvfrom()或WSARecvFrom()函数接收数据。(5)使用closesocket()函数关闭套接口。(6)调用WSACleanup()函数,结束Windows Sockets API的使用。至此,一次无连接的数据报传输过程结束。无连接的客户与服务器之间的交互通信模型可以用图7-2表示。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例W
17、SAStartup()socket()bind()recvfrom()sendto()closesocket()WSACleanup()交换数据交换数据WSAStartup()socket()bind()sendto()recvfrom()closesocket()WSACleanup()图7-2 无连接的客户/服务器程序工作模型第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例在编写无连接的客户/服务器程序时,应该注意以下几个问题:(1)通信的一方可以不用bind()绑定IP地址和端口,而由系统自动分配。(2)不绑定IP地址和端口的一方必须首先向绑定地址的一方发送数据。(3)无连接
18、应用程序也可以调用connect()函数,但是它并不向对方发出建立连接的请求,内核只是将connect()中指定的目标方的IP地址和端口号记录下来,在以后的通信中就可以使用面向连接的数据发送函数send()和数据接收函数revc()。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例(4)无连接的数据报传输过程中,作为服务器的一方也必须先启动,否则客户请求传不到服务进程。(5)由于无连接的客户端一般不调用connect(),因此在数据发送之前,客户与服务器之间尚未建立一个全相关(五元组),但各自通过socket()和bind()调用建立了半相关。发送数据时,发送方除指定本地套接口的地
19、址外,还需指定接收方套接口的地址,从而在数据收发过程中动态地建立全相关。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.2 基于基于TCP的客户的客户/服务器通信程序实例服务器通信程序实例 7.2.1 实例程序说明 实例程序使用的编程环境为当前常用的Visual C+6.0。为了便于大家理解用Socket进行网络程序设计的原理,本程序使用了Visual C+6.0下的控制台程序“Win32 Console Application”。控制台程序的结构一目了然,使程序中各种Winsock API调用都非常清楚。该程序中通信协议使用的是面向连接的TCP协议(SOCK_STREAM)。
20、服务器端的IP地址使用系统指定的IP地址,端口号在程序中指定为5050,用符号常量来定义。第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例7.2.2 服务器端程序/*调试环境:Visual C+6.0服务器IP地址:由系统指定服务器端口号:5050程序名称:server.cpp程序功能:服务器端的程序当有客户提出连接请求时,在端口5050与客户端进行TCP连接,第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例连接成功后,显示客户IP地址和端口号,并给客户端发送 Hello!I am a server.字符串。如果发送正确则显示所发送的字节数命令格式:server*/#i
21、nclude#include#include/服务器使用的端口号为5050#define DEFAULT_PORT 5050void main()第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例intiPort=DEFAULT_PORT;WSADATAwsaData;SOCKETsListen,sAccept;/客户地址长度intiLen;/发送的数据长度intiSend;/要发送给客户的信息char buf=I am a server.;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/服务器和客户的地址struct sockaddr_inser,cli;printf
22、(-n);printf(Server waitingn);printf(-n);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)printf(Failed to load Winsock.n);return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/创建服务器端套接口sListen=socket(AF_INET,SOCK_STREAM,0);if(sListen=INVALID_SOCKET)p r i n t f(s o c k e t()F a i l e d:%d n ,WSAGetLastError();return;/以下建立服务
23、器端地址 ser.sin_family=AF_INET;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/htons()函数把一个双字节主机字节顺序的数转换为网络字节顺序的数ser.sin_port=htons(iPort);/htonl()函数把一个四字节主机字节顺序的数转换为网络字节顺序的数/使用系统指定的IP地址INADDR_ANYser.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)=SOCKET_ERROR)p r i n t f(b i n d()F a i l
24、 e d:%d n ,WSAGetLastError();return;第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例/进入监听状态if(listen(sListen,5)=SOCKET_ERROR)printf(listen()Failed:%dn,WSAGetLastError();return;/初始化客户地址长度参数iLen=sizeof(cli);/进入一个无限循环,等待客户的连接请求第第7章章 TCP/IP网络程序框架与实例网络程序框架与实例while(1)s A c c e p t=a c c e p t(s L i s t e n,(s t r u c t soc
展开阅读全文