您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第13章TCPIP网络编程实践.
第13章TCP/IP网络编程实践网络应用程序的标识问题客户/服务器模型TCP/IP应用程序工作模型TCP网络应用编程UDP网络应用编程UDP广播编程原始套接字编程213.1网络应用程序的标识问题应用程序分为两种:•一种程序不需要使用其他程序产生的数据并且其他程序也不使用它输出的数据;•另一种程序需要与其他的应用程序进行数据交换才能完成其功能,也就是说程序之间存在通信问题。进程间通信的问题也可以分为两种:•一种是在操作系统中论述的单机系统中进程间的通信问题;•另一种一般是在不同系统的进程间通过网络通信协议进行的进程间的通信问题。3网络应用程序的标识问题同一系统中不同进程间进行通信时,通过系统分配的进程号(ProcessID)就可以惟一标识一个进程•要通信的进程只要知道对方的进程号就可以进行通信网络情况下不能只简单地用进程号来标识不同的进程,因为各主机都独立地分配其进程号为了惟一地标识网络中通信的一个进程(即通信的某一方),就要使用一个如下的三元组:•(本地协议,本地IP地址,本地端口号)4网络应用程序的标识问题一个三元组只指定了通信时一条连接的半个部分,即通信的一方,因而称为半相关(Half-association)。要完整地表示网络中进行通信的两个进程,那么就要使用一个如下结构的六元组:•(本地协议,本地地址,本地端口号,远地协议,远地地址,远地端口号)通信的两个进程在端到端的传输层只能使用相同的协议。一个完整的网间通信就可以简化为用一个五元组来标识通信的两个进程:•(协议,本地IP地址,本地端口号,远程IP地址,远程端口号)513.2客户/服务器模型客户/服务器模型是一种通信模式,一个应用程序被动地等待,而另一个应用程序通过请求启动通信客户和服务器分别指两个应用程序,客户端(client)向服务器发出服务请求,服务器(server)对客户端的请求做出响应。6客户/服务器模型1.客户/服务器模型的特点客户/服务器模型的通信方式从所具有的资源角度来说,有明显的非对称性。•服务器拥有较多的资源,具有运算能力强,数据存储容量大,通信速度快,系统的可靠性高等优点•客户拥有较少的资源,在各方面的性能一般要比服务器差客户/服务器模型在工作时,要求有一套客户机和服务器能共同识别的规则或约定,用来保证服务器方可以识别客户提出的请求是什么,客户方也能够解释收到的服务器应答。•从本质上来说,这其实就是服务器方和客户方在通信中所使用的一套协议,它必须在通信的两端都被实现。7客户/服务器模型根据实际情况,协议可能是对称的也可能是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地认为是主机(服务器),而另一方则是从机(客户机)2.服务器的分类根据服务器提供服务方式的不同,服务器可以分为串行服务器和并发服务器串行服务器只有一个进程,用串行的方式对客户的请求提供服务;并发服务器可以为请求的每一个客户创建一个进程或线程,然后由对应的进程或线程给每一个客户提供服务8客户/服务器模型3.客户/服务器模型的特点对于服务器方来说:服务进程一般在启动后就一直运行,以等待客户请求的到来,除非服务被禁止或服务程序被强制终止服务器方进程使用的是众所周知的端口,否则客户无法知道提供服务的端口,也就不可能提出服务的请求一般,服务器方通常拥有较多的资源服务器方进程可以并行处理一定数量的客户请求服务器方在通信时属于被动的一方9客户/服务器模型对于客户方来说:在需要时向服务器提出请求,请求的服务得到满足并完成处理任务后,就终止客户程序的执行向系统申请临时端口与服务器方进程进行通信一般拥有相对较少的资源客户方在通信时属于主动的一方1013.3TCP/IP应用程序工作模型TCP/IP协议的核心内容在层次结构的低三层,即网络接口层、IP层和传输层。这三层的功能一般是由操作系统的内核来实现两台主机的进程间通过网络编程接口进行通信的原理图:客户应用程序网络应用程序编程接口TCP/IP核心协议物理传输介质服务器应用程序网络应用程序编程接口TCP/IP核心协议物理传输介质11TCP/IP应用程序工作模型使用TCP或UDP端口号作为一个服务器程序的标识server启动时在本地主机注册TCP或UDP端口号client直接向server使用的UDP端口发送信息访问某个特定的服务;如果使用的是TCP传输协议,则client与server使用的TCP端口先建立连接,然后发送信息运行server的主机在注册的端口上收到信息后,将信息转交给注册该端口的server程序处理套接字绑定接收数据处理数据返回处理结果UDP循环服务器处理过程TCP循环服务器处理过程服务器客户客户客户客户循环服务器父进程服务器子进程服务器子进程服务器子进程客户机客户机客户机…………并发服务器处理流程1413.4TCP网络应用编程服务器程序流程(多线程):初始化并创建socket填写本机地址信息绑定并监听一个固定的端口收到Client的连接后建立一个新的socket连接产生一个新的线程与Client进行通信子通信结束后中断与Client的连接客户端程序流程:初始化并创建socket填写服务器地址信息连接服务器与服务器进行通信通信结束后断开连接15sockaddr_inserver_Sin;SOCKETsSocket;建立Socketbind(),指定sSocket到server_Sinlisten(),sSocket进入侦听状态accept(),sSocket等待接受Client端的连接请求建立连接,accept()传回新的socket名称Socket1recv()/send(),依Socket1来传送与接收数据,直到交换完成closesocket(),关闭Socket1closesocket(),关闭sSocketSOCKETcSocket;建立StreamSocketconnect(),将cSocket与Server端连接send()/recv(),依cSocket来传送与接收数据,直到交换完成closesocket(),关闭cSocket,結束TCP对话TCPServerTCPClientWSAStartup( ),初始化winsockWSACleanup( ),释放winsock1613.5UDP网络应用编程无连接的数据报(SOCK_DGRAM)传输服务在传输层使用UDP协议。特点是不需要在客户和服务器之间先建立连接。通信的任何一方可以先发送数据,这样首先发送数据的一方就成了客户端,而接收数据的一方就是服务器端。在数据传输完成后,只要关闭套接口,释放网络资源,通信过程就结束了。17无连接的客户/服务器程序工作流程(1)使用WSAStartup()函数检查系统协议栈的安装情况。(2)使用socket()或WSASocket()函数创建套接口,以确定相关五元组的协议。(3)使用bind()函数将创建的套接口与本地地址绑定。它确定了相关五元组中的本地IP地址和端口号(4)使用sendto()或WSASendTo()函数发送数据,使用recvfrom()或WSARecvFrom()函数接收数据。(5)使用closesocket()函数关闭套接口。(6)调用WSACleanup()函数,结束WindowsSocketsAPI的使用。至此,一次无连接的数据报传输过程结束。18无连接的客户/服务器程序工作流程WSAStartup()socket()bind()recvfrom()sendto()closesocket()WSACleanup()交换数据交换数据WSAStartup()socket()bind()sendto()recvfrom()closesocket()WSACleanup()服务器客户端19无连接的客户/服务器程序工作流程无连接的客户/服务器编程注意事项:(1)通信的一方可以不用bind函数绑定IP地址和端口(2)在建立Socket后若没有绑定地址,直接用sendto函数发数据时,系统会自动分配地址和端口(3)在recvfrom函数接收数据前,套接字必须有指定的本地地址和端口(4)一般由不绑定IP地址和端口的一方首先向绑定地址的一方发送数据(5)服务器的一方必须先启动,否则客户请求传不到服务进程(6)发送数据时,发送方除指定本地套接口的地址外,还需指定接收方套接口的地址,从而在数据收发过程中动态地建立全相关20UDP网络通信程序实例一个简单的UDP客户/服务器程序实例程序说明:程序使用的编程环境为VisualC++6.0,使用的是控制台程序“Win32ConsoleApplication”通信协议使用无连接的UDP协议(SOCK_DGRAM)服务器端IP地址使用系统指定的IP地址,端口号在程序中指定为5050,用符号常量定义服务器端从客户端接收并显示信息,客户端向服务器发送的信息为“Hello!Iamaclient.”服务器也向客户端发送“Hello!Iamaserver.”信息,客户端接收从服务器发送的信息并进行显示21UDP服务器源代码2223242526UDP客户端源代码27282930服务器运行结果第1次客户端连接第2次客户端连接客户端运行结果31广播/多播报文的发送广播/多播报文的接收13.6UDP广播/多播编程32套接口选项使用setsockopt和getsockopt函数可以设置或者读取套接口的选项值,这两个函数的定义如下:intsetsockopt(SOCKETs,intlevel,intoptname,constcharFAR*optval,intoptlen);intgetsockopt(SOCKETs,intlevel,intoptname,charFAR*optval,intFAR*optlen);参数说明:•参数s是套接口描述字•level[IN/lN]是套接口选项的级别•optname[IN/lN]是用户指定的选项名称•optval[IN/OUT]是一个指向变量的指针,它的大小由optlen[IN/OUT]指定,通过optval可以设置或者读取指定选项的值•如果没有错误发生,函数返回0;否则返回SOCKET_ERROR33套接口选项Winsock的套接口选项主要有两种类型:布尔型,用于启用或禁止套接口的某个属性;选项参数,整型或者结构体,设置特定的值。•为了启用某个布尔型选项,optval应指向某个非零整数,若要禁用,则指向一个零值整数,同时optlen参数值应该等于布尔型大小,即sizeof(BOOL);•对于其他选项类型,optval应指向整型或者结构体,optlen值为整型或者结构体的大小。Winsock支持的全部选项级别有SOL_SOCKET、IPPROTO_lP、IPPROTO_IPV6、IPPROTO_RM、IPPROTO_TCP、IPPROTO_UDP、NSPROTO_lPX、SOL_APPLETALK、SOL_IRLMP。34SOL_SOCKET级别的部分选项(1)SO_BROADCAST,BOTH,布尔型(BOOL)。用于允许/禁止发送广播报文。BOTH:该选项既可以设置也可以读取。(2)SO_RCVTIMEO,BOTH,structtimeval结构型,用于设置数据接收超时值。该选项用于在一个阻塞套接口为接收函数设定一个超时值。当调用接收函数时,如果在SO_RCVTIMEO指定的时间内没有数据到来,那么函数调用也会结束并且返回错误10060(WSAETIMEDOUT)。(3)SO_SNDTIMEO,BOTH,structtimeval结构型,用于设置数据发送超时值。该选项用于在一个阻塞套接口为发送函数设定一个超时值。当调用发送函数时,如果在SO_SNDTIMEO指定的时间内数据还未发送成功,那么函数调用也会结束并且返回错误10060(WSAETIMEDOUT)。35IPPROTO_IP级别
本文标题:第13章TCPIP网络编程实践.
链接地址:https://www.777doc.com/doc-2153522 .html