第一章 简介

什么是 Windows Sockets 规范?

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 又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。它们之间的关系如图 1-1。

第一章 简介 - 图1

图 1-1 应用程序与 W indow s Sockets 关系图

虽然我们并不反对使用这一套 API 来实现另一通讯协议栈(而且我们期望在将来规范的修改中能够讨论这个问题),但这种用法已经超出了我们这一份规范所规定的范围,我们在此将不作讨论。

Bekeley 套接口

Windows Sockets 规范是建立在 Bekeley 套接口模型上的。这个模型现在已是 TCP/IP 网络的标准。它提供了习惯于 UNIX 套接口编程的程序员极为熟悉的环境,并且简化了移植现有的基于套接口的应用程序源代码的工作。Windows Sockets API 也是和 4.3BSD 的要求一致的。

Microsoft Windows 和针对 Windows 的扩展

这一套 Windows Sockets API 能够在所有 3.0 以上版本的 Windows 和所有Windows Scokets 实现上使用,所以它不仅为 Windwos Sockets 实现和 Windows

Sockets 应用程序提供了 16 位操作环境,而且也提供了 32 位操作环境。Windows Sockets 也支持多线程的 Windows 进程。一个进程包含了一个或多

个同时执行的线程。在 Windows 3.1 非多线程版本中,一个任务对应了一个仅具有单个线程的进程。而我们在本书中所提到的线程均是指在多线程 Windows 环境中的真正意义的线程。在非多线程环境中(例如 Windows 3.0)这个术语是指Windows Sockets 进程.

Windows Sockets 规范中的针对 Windows 的扩展部分为应用程序开发者提供了开发具有 Windows 应用软件的功能。它有利于使程序员写出更加稳定并且更加高效的程序,也有助于在非占先 Windows 版本中使多个应用程序在多任务情况下更好地运作。除了 WSAStartup()和 WSACleanup()两个函数除外,其他的 Windows 扩展函数的使用不是强制性的。

这份规范的地位

Windows Sockets 是一份独立的规范。它的产生和存在是为了造益于应用程序开发者,网络软件供应商和广大计算机用户。这份规范的每一份正式出版的版本(非草稿)实际上代表了为网络软件供应商实现所需和应用程序开发者所用的一整套 API。关于这套规范的讨论和改进还正在进行之中。这样的讨论主要是通过 Internet 上的一个电子邮件论坛-winsock@microdyne.com 进行的。同时也有不定期的会议举行。会议的具体内容会在电子邮件论坛上发表。

  1. 曾经作过的修改

    1. Windows Sockets 1.0

Windows Sockets 1.0 代表了网络软件供应商和用户协会细致周到的工作的结晶。Windows Sockets 1.0 规范的发布是为了让网络软件供应商和应用程序开发者能够开始建立各自的符合 Windows Sockets 标准的实现和应用程序。

Windows Sockets 1.1

Windows Sockets 1.1 继承了 Windows Sockets 1.0 的准则和结构,并且仅在一些绝对必要的地方作了改动。这些改动都是基于不少公司在创作 Windows Sockets 1.0 实现时的经验和教训的。Windows Scokets 1.1 包含了一些更加清晰的说明和对 Windows Sockets 1.0 的小改动。此外 1.1 还包含了如下重大的变

更:

  • 加入了 gethostname()这个常规调用,以便更加简单地得到主机名字和地址。

  • 定义 DLL 中小于 1000 的序数为 Windows Sockets 保留,而对大于 1000 的序数则没有限制。这使 Windows Sockets 供应商可以在 DLL 中加入自己的界面, 而不用担心所选择的序数会和 Windows Scokets 将来的版本冲突。

  • 增加了 WSAStartup()函数和 WASClearup()函数之间的关联,要求两个函数互相对应。这使得应用程序开发者和第三方 DLL 在使用 Windows Sockets 实现时不需要考虑其他程序对这套 API 的调用。

  • 把函数 intr_addr()的返回类型,从结构 in_addr 改为了无符号长整型。这个改变是为了适应 Microsoft C 编译器和 Borland C 编译器对返回类型为四字节结构的函数的不同处理方法。

  • 把 WSAAsyncSelect()函数语义从“边缘触发”改为“电平触发”。这种方式大大地简化了一个应用程序对这个函数的调用。

  • 改变了 ioctlsocket()函数中 FIONBIO 的语义。如果套接口还有未完成的WSAAsyncSelect()调用,该函数将失败返回。

  • 为了符合 RFC 1122,在套接口选项中加入了 TCP_NODELAY 这一条。

所有 Windows Sockets 1.1 对于 Windows Sockets 1.0 的改动在以下都作了记号。