第三讲 网络程序设计基础_第1页
第三讲 网络程序设计基础_第2页
第三讲 网络程序设计基础_第3页
第三讲 网络程序设计基础_第4页
第三讲 网络程序设计基础_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、第三讲 网络程序设计基础学习要点:n 学习介绍Windows网络程序设计的基本方法和概念;一、内存影射文件n 就是在内存中申请一块内存空间,将一个文件与这块空间相联,将一个文件句柄与这块内存相关联,几个进程就可以通过操作这个影射文件,实现进程间的通信。在Windows中,通过CreateFileMapping来创建内存影射文件。二、邮件槽(MailSlot)n 邮件槽:是一种简单的单向的进程间通信方式。通过邮件槽,客户端程序可以将消息传送或广播给一个或多个服务器进程。在同一台计算机的不同进程之间,或在跨越整个网络的不同计算机的进程之间,协助进行消息的传输。邮件槽(MailSlot)n 邮件槽通

2、常用“数据报”在网络上传播,数据报实际上是一些小数据包,以一种无连接的形式传播,不要求对方收到确认信息。显然,这是一种“不可靠”的数据传输。邮件槽(MailSlot)n 邮件槽的优点:它使客户端程序能非常容易地将广播消息发送给一个或多个应用。n 邮件槽的缺点:只允许从客户到服务器,建立一种不可靠的单向数据通信。邮件槽(MailSlot)n 服务器邮件槽示例代码:n / Create the mailslotif (Mailslot=CreateMailSlot( .MailslotMyslot, 0, MAILSLOT_WAIT_FOREVER,NULL) = INVALID_HANDLE_V

3、ALUE)return;while(ReadFile(Mailslot, buffer, 256, &NumberofBytersRead, NULL) != 0) printf(“%.*sn”, NumberofBytesRead, buffer);邮件槽(MailSlot)n 客户邮件槽示例代码:n / Create the mailslot sprintf(ServerName,%sMailslotMyslot,a rgv);if (Mailslot=CreateFile(ServerName, GENERIC_WRITE,FILE_SHARE_READ,OPEN_EXISTING,FI

4、LE_ATT RIBUTE_NORMAL,NULL) = INVALID_HANDLE_VALUE)return;WriteFile(Mailslot, “This is a test”, 14, &BytesWritten);ClosHandle(Mailslot);三、命名管道(Named Pipes)n 命名管道(Named Pipes)是一种简单的进程间通信机制,命名管道可以在同一台计算机的不同进程之间或在跨越一个网络不同计算机之间,支持可靠的、单向或双向的数据通信。将命名管道作为一种网络编程方案使用时, 它实际上建立一个简单的客户机/服务器数据通信体系,可以在其中可靠的传输数据。命名

5、管道命名规范n 命名管道命名规范格式:ServerPipepathname Server:指定一个服务器的名字Pipe:是一个不可变化的“硬编码”字串,原样照录,不区分大小写。pathname:使应用程序可以唯一地定义及标定一个 命名管道的名字,而且可以设置多级目录:这几个字符串均是合法的命名管道的名字:myserverPIPEmypipeTestserverpipecooldirectoryfuntestjim.PipeEasynamedpipe命名管道(Named Pipes)n 服务器实现细节(1) 使用API函数CreateNamedPipe,创建一个命名管道实例句柄;(2) 使用AP

6、I函数ConnectNamePipe,在命名管道实例上客户机连接请求。(3) 分别使用ReadFile和WriteFile这两个API 函数,从客户机接受数据,或将数据发给客户端;(4) 使用API函数DisconnectNamePipe,关闭命名管道连接;(5) 使用API函数CloseHandle,关闭命名管道句柄。命名管道(Named Pipes)n 服务器实现细节if (PipeHandle=CreateNamedPipe(“.PipeJim”,PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE|PIPE_READMODE_BYTE,1,0,0,1000,NULL) r

7、eturn;if (ConnectNamedPipe(PipeHandle, NULL) = 0)return; if (ReadFile(PipeHandle,buffer,sizeof(buffer), &BytesRead,NULL)=0) return;if (DisconnectNamedPipe(PipeHandle)=0) return;CloseHandle(PipeHandle);命名管道(Named Pipes)n 客户机实现细节(1) 使用API函数WaitNamedPipe,等候一个命名管道实例可供自己使用。(2) 使用API函数CreateFile,建立与命名管道的连

8、接。(3) 用API函数ReadFile和WriteFile,分别向服务器发送数据,或从中接受数据。(4)使用API函数CloseHandle,关闭命名管道句柄。命名管道(Named Pipes)n 客户机实现细节if (WaitNamedPipe(PIPE_NAME,NMPWAIT_FOREVER)=0)return;if (PipeHandle=CreateFile(PIPE_NAME, GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)=INVALID_HANDLE_VALUE) retu

9、rn;if (WriteFile(PipeHandle,“This is a test”,14,&BytesWritten,NULL)=0) return;CloseHandle(PipeHandle);四、套接字(Socket)n 套接字(Socket)是目前网络程序设计应用最多的程序设计方法。1. 套接字的发展n 1980年伯克利大学发行的BSD UNIX开始支持TCP/IP协议,并且提出了一种叫做套接字(Socket)的编程接口。它提供了一些非常灵活的函数,有助于程序员针对不同情况编写出高效的网络通信程序。n 套接字编程接口不仅适合TCP/IP协议,同样也适合其他的网络协议,它已经成为网

10、络编程接口的标准。Windows操作系统也提供了全部的套接字函数(WinSocket),并对它进行了扩展。2. 几个基本概念n 面向连接和无连接面向连接的服务中,进行数据交换之前, 必须与通信方建立一条路径,既确定了通信方之间存在路由,又保证了通信双方是活动的,都可以彼此响应,但需要很多额外的开支,大部分面向连接的协议为保证投递无误。无连接协议不保证接受端是否正在收听。无连接协议类似于邮政服务。几个基本概念n 可靠性和次序性可靠性保证了发送端发出的每个字节都能到达既定的接受端,不具备可靠性的协议则不能保证每个字节都能到达接受端, 同样不能保证数据的完整性。次序性是指对数据到达接受端的顺序进行处

11、理,保护次序性的协议保证接受端收到数据顺序就是数据的发送顺序。几个基本概念n 从容关闭从容关闭只出现在面向连接的协议中。在这种关闭过程中,一方开始关闭通信会话,但另一方仍然可以读取线上或网络堆栈上已挂起的数据。如果面向连接的协议 不支持从容关闭,都会导致连接立即中断, 数据丢失,接受端不能读取数据这些情况出现。几个基本概念n 广播数据广播数据即数据从一个工作站发出,局 域网内的所有其他所有工作站都能收到它。这一特性适用用于无连接性,因为LAN上的所有机器的网卡都可获得并处理广播消息。各个机器受到广播包后,会花时间来处 理这个数据包,看是否有应用对他感兴趣, 所以广播数据对网络和机器的效率有一定

12、的影响。一般情况下,路由器不会传送广播包。几个基本概念n 多播数据多播数据是指一个进程发送数据的能力, 这些数据将由一个或多个接受端进行接受。进程加入一个多播会话的方法和采用的基层协议有关。比如,IP协议下,多播是广播的一种变形,IP多播要求对收发数据感兴趣加入一个特定的组。只有绑定组地址的数据才会被网络硬件捡起。视频会议应用常常使用多播。几个基本概念n 服务质量(QOS,Quality of Service)服务质量是应用的一种能力,用以请求针对专门用途分配特定的带宽。服务质量的好处可在流式(媒体)的传输上见到。几个基本概念n TCP面向连接的通信是通过“传输控制协 议”(Transmiss

13、ion Control Protocol, TCP)来完成的,TCP提供两台计算机之间的可靠无错的数据传输。应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。这个连接一旦建立,两台计算机之间就可以把数据当作一个双向字节流来进行交换。几个基本概念n UDP无连接通信是通过“用户数据报协议”(User Datagram Protocol,UDP)来完成的,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接收若干个源的数据。简单说,如果一个客户机向服务器发送数据,这一数据会立即发出,不管服务器是否已准备接受数据。如果服务器收到客户机的数据,它不会确认收到与否。3. 基本的套接字函

14、数n socket:创建一个套接字SOCKET socket(int af, int type, int protocol)af: 指定地址族,例如:AF_INET指IPV4地址,AF_INET6指IPV6地址;type: 指定创建套接字的类型,可以是SOCK_STREAM(TCP),SOCK_DGRAM(UDP),SOCK_RAW;protocol:特定的协议类型,如IPPROTO_TCP(TCP),IPPROTO_UDP(UD P),IPPROTO_ICMP(ICMP)基本的套接字函数n bind:把一个本地地址和一个套接字绑定int bind(SOCKET s, struct socka

15、ddr Far *name, int namelen);s: 待绑定的套接字描述句柄;name: 指向分配给套接字地址的指针;namelen: 包含的地址的字节长度;struct sockaddr short sin_family/ 一定是AF_INET u_short sin_port;/ 端struct in_addrsin_addr;/ IP地址charsin_zero8;/ 填充字符基本的套接字函数n listen:设置套接字进入侦听状态int listen(SOCKET s, int backlog); s: 待绑定的套接字描述句柄;int backlog: 等待连接的队列最大长度,

16、一般设为SOMAXCONN;基本的套接字函数n connect:函数connect为一个指定的套接字建立连接。int connect(SOCKET s, struct sockaddrFAR *name, int namelen)s: 未连接的套接字描述句柄; name: 连接到的套接字地址; namelen: name参数的字节长度。基本的套接字函数n accept:接受对指定套接字的连接请求,返回一个代表连接的套接字。int accept(SOCKET s, struct sockaddrFAR *addr, int namelen)s: 指定接受连接请求的SOCK_STREAM类型套接字

17、的描述句柄。addr: 它接受连接请求方的地址;addrlen: addr参数的字节长度。基本的套接字函数n gethostbyaddr和gethostbyname:gethostbyaddr返回相应网络地址的主机信息;gethostbyname从一个主机数据库中返回对应网络的主机信息。基本的套接字函数n recv: 从一个已经连接的套接字接受数据int recv(SOCKET s,char FAR *buf, int len, int flags)s: 已经连接的套接字句柄; buf: 接受数据缓冲区; len: 缓冲区的长度; flags: 接受方法标志。基本的套接字函数n recvfro

18、m: 接受一个数据报并保存数据报的源地址int recvfrom(SOCKET s,char FAR *buf,int len, int flags,struct sockaddr FAR*from, int FAR * fromlen) s: 已经绑定的套接字句柄; buf: 接受数据缓冲区; len: 缓冲区的长度; flags: 接受方法标志from: 保存返回的源地址;fromlen: 存放from缓冲区的长度。基本的套接字函数n send: 从一个已经连接的套接字接受数据int send(SOCKET s,char FAR *buf, int len, int flags)s: 已经

19、连接的套接字句柄; buf: 包含发送数据的缓冲区; len: 缓冲区的长度;flags: 发送方法标志。基本的套接字函数n sendto: 向指定的目的发送数据int sendto(SOCKET s,char FAR *buf, intlen, int flags, struct sockaddr FAR*to,int tolen)s: 已经连接的套接字句柄; buf: 包含发送数据的缓冲区; len: 缓冲区的长度;flags: 发送方法标志;to: 保存返回的源地址;tolen: 存放to缓冲区的长度。基本的套接字函数n shutdownint shutdown(SOCKET s, in

20、t how) s: 套接字描述句柄how: 标志参数,描述不再允许的操作类型基本的套接字函数n inet_addr,inet_ntoainet_addr把一个IPV4版本的因特网点分地址字符串转换成和in_addr结构一致的二进制地址形式;inet_ntoa把一个IPV4版本in_addr结构形式的因特网地址转换成标准的因特网点分地址字符串。基本的套接字函数n closesocket: 关闭一个存在的套接字int closesocket(SOCKET s)s: 将要关闭的套接字句柄;4.套接字编程基本流程服务器客户机连接请求关闭连接采用 协议通信套接字程序流程结构closesocketclos

21、esocketsend(发送数据)recv(连接)recv(接受数据)send(发送数据)accept(接受连接)connect(连接)接受连接listen(等待连接)bind(绑定地址)bind(绑定地址)socket(分配套接字)socket(分配套接字)套接字编程基本流程客户机服务器采用UDP协议通信套接字程序流程结构closesocketclosesocketsendto(发送数据)recvfrom(接受数据)recvfrom(接受数据)sendto(发送数据)bind(绑定地址)bind(绑定地址)socket(分配套接字)socket(分配套接字)5.几种服务器实现方案n 在套接字

22、编程中,客户机的编程较简单,但服务器要考虑同时连接多个客户机,而且要尽可能提高服务效率,因此,服务器方程序设计比较复杂,要根据不同的情况采用不同的方案。在Windows操作系统中,提供了多种方案可供选择。几种服务器实现方案n WSAAsySelect方案应用程序可在一个或多个套接字上,接受以Windows消息为基础的网络。主要的网络有:FD_READ: 接受可读FD_WRITE: 接受可写FD_ACCEPT: 接受有连接进入FD_CONNECT: 接受连接完成统治;FD_CLOSE: 接受套接字关闭的统治。几种服务器实现方案n WSAEventSelect方案和WSAAsyncSelect类似

23、,它也允许应用程序在用程序可在一个或多个套接字上,接受以为基础的网络时间。它与WSAAsySelect的主要区别在于网络会投递到一个对象句柄,而非投递到一个窗口句 柄。但该方法一次最多只能处理64个套接字。几种服务器实现方案n 多线程方式即服务器每接受到一个连接请求后,就为这个连接套接字创建一个新的工作线程, 来处理客户机的各种网络数据。几种服务器实现方案n 完成端口方式(Completion Port)完成端口是最为复杂的一种方案,假如应 用程序要同时管理成百上千的套接字,并 且希望随着系统内安装的CPU数量的增加,应用程序的性能也可以线性提高。五、计算机支持的协同工作(CSCW)n 计算机支持的协同工作(CSCW)(Computer Supported Cooperative Work)n 地域分散的一个群体借助计算机及其网络技术, 共同协调与协作来完成一项任务,包括群体工作 方式研究和支持群体工作的相关

温馨提示

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

评论

0/150

提交评论