Visual C /MFC入门教程(六)
2008-02-23 05:23:44来源:互联网 阅读 ()
6.1 WinSock介绍
Windows下网络编程的规范-Windows Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。
Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micosoft Windows下网络编程接口。他不但包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程式员能充分地利用Windows消息驱动机制进行编程。Windows Sockets规范本意在于提供给应用程式研发者一套简单的API,并让各家网络软件供给商一起遵守。此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来确保应用Windows Sockets API的应用程式能够在任何网络软件供给商的符合Windows Sockets协议的实现上工作。因此这份规范定义了应用程式研发者能够使用,并且网络软件供给商能够实现的一套库函数调用和相关语义。遵守这套Windows Sockets规范的网络软件,我们称之为Windows Sockets兼容的,而Windows Sockets兼容实现的提供者,我们称之为Windows Sockets提供者。一个网络软件供给商必须百分之百地实现Windows Sockets规范才能做到现Windows Sockets兼容。任何能够和Windows Sockets兼容实现协同工作的应用程式就被认为是具备Windows Sockets接口。我们称这种应用程式为Windows Sockets应用程式。Windows Sockets规范定义并记录了如何使用API和Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是任何的Windows Sockets实现都支持流套接口和数据报套接口.应用程式调用Windows Sockets的API实现相互之间的通讯。Windows Sockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。他们之间的关系如图
通信的基础是套接口(Socket),一个套接口是通讯的一端。在这一端上您能够找到和其对应的一个名字。一个正在被使用的套接口都有他的类型和和其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程式)。Windows Sockets规范支持单一的通讯域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通讯(Windows Sockets 1.1以上的版本支持其他的域,例如Windows Sockets 2)。套接口能够根据通讯性质分类;这种性质对于用户是可见的。应用程式一般仅在同一类的套接口间通讯。但是只要底层的通讯协议允许,不同类型的套接口间也照样能够通讯。用户现在能够使用两种套接口,即流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不确保是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或和发出时的顺序不同。数据报套接口的一个重要特点是他保留了记录边界。对于这一特点,数据报套接口采用了和现在许多包交换网络(例如以太网)很类似的模型。
一个在建立分布式应用时最常用的范例便是客户机/服务器模型。在这种方案中客户应用程式向服务器程式请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时需要有一套为客户机和服务器所共识的惯例来确保服务能够被提供(或被接受)。这一套惯例包含了一套协议。他必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地认为是主机,而另一方则是从机。一个对称协议的例子是Internet中用于终端仿真的TELNET。而非对称协议的例子是Internet中的FTP。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在"客户进程"和"服务进程"。一个服务程式通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程式被"惊醒"并且为客户提供服务-对客户的请求作出适当的反应。这一请求/相应的过程能够简单的用图表示。虽然基于连接的服务是设计客户机/服务器应用程式时的标准,但有些服务也是能够通过数据报套接口提供的。
数据报套接口能够用来向许多系统支持的网络发送广播数据包。要实现这种功能,网络本身必须支持广播功能,因为系统软件并不提供对广播功能的任何模拟。广播信息将会给网络造成极重的负担,因为他们需要网络上的每台主机都为他们服务,所以发送广播数据包的能力被限制于那些用显式标记了允许广播的套接口中。广播通常是为了如下两个原因而使用的:1. 一个应用程式希望在本地网络中找到一个资源,而应用程式对该资源的地址又没有任何先验的知识。2. 一些重要的功能,例如路由需要把他们的信息发送给任何能够找到的邻机。被广播信息的目的地址取决于这一信息将在何种网络上广播。Internet域中支持一个速记地址用于广播-INADDR_BROADCAST。由于使用广播以前必须捆绑一个数据报套接口,所以任何收到的广播消息都带有发送者的地址和端口。
Intel处理器的字节顺序是和DEC VAX处理器的字节顺序一致的。因此他和68000型处理器连同Internet的顺序是不同的,所以用户在使用时要特别小心以确保正确的顺序。任何从Windows Sockets函数对IP地址和端口号的引用和传送给Windows Sockets函数的IP地址和端口号均是按照网络顺序组织的,这也包括了sockaddr_in结构这一数据类型中的IP地址域和端口域(但不包括sin_family域)。考虑到一个应用程式通常用和"时间"服务对应的端口来和服务器连接,而服务器提供某种机制来通知用户使用另一端口。因此getservbyname()函数返回的端口号已是网络顺序了,能够直接用来组成一个地址,而无需进行转换。然而假如用户输入一个数,而且指定使用这一端口号,应用程式则必须在使用他建立地址以前,把他从主机顺序转换成网络顺序(使用htons()函数)。相应地,假如应用程式希望显示包含于某一地址中的端口号(例如从getpeername()函数中返回的),这一端口号就必须在被显示前从网络顺序转换到主机顺序(使用ntohs()函数)。由于Intel处理器和Internet的字节顺序是不同的,上述的转换是无法避免的,应用程式的编写者应该使用作为Windows Sockets API一部分的标准的转换函数,而不要使用自己的转换函数代码。因为将来的Windows Sockets实现有可能在主机字节顺序和网络字节顺序相同的机器上运行。因此只有使用标准的转换函数的应用程式是可移植的。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C语言图像函数
下一篇: Visual C /MFC入门教程(五)
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash