本文介绍 Windows 套接字的性质及用途。 本文还:
Windows 套接字规范为 Microsoft Windows 定义二进制兼容的网络编程接口。 Windows 套接字基于加州大学伯克利分校软件分发(BSD,版本 4.3)中的 UNIX 套接字实现。 该规范包括 BSD 样式的套接字例程和特定于 Windows 的扩展。 使用 Windows 套接字允许应用程序跨符合 Windows 套接字 API 的任何网络进行通信。 在 Win32 上,Windows 套接字提供线程安全性。
许多网络软件供应商支持网络协议下的 Windows 套接字,包括传输控制协议/Internet 协议(TCP/IP)、Xerox 网络系统(XNS)、数字设备公司的 DECNet 协议、Novell Corporation 的 Internet 数据包交换/序列打包交换(IPX/SPX)等。 尽管目前的 Windows 套接字规范定义了 TCP/IP 的套接字抽象,但任何网络协议都可以通过提供实现 Windows 套接字的动态链接库 (DLL) 的自己的版本来符合 Windows 套接字。 使用 Windows 套接字编写的商业应用程序的示例包括 X Windows 服务器、终端模拟器和电子邮件系统。
注释
Windows 套接字的目的是抽象化基础网络,这样就不必了解该网络,因此应用程序可以在支持套接字的任何网络上运行。 因此,本文档不讨论网络协议的详细信息。
Microsoft基础类库(MFC)通过提供两个类支持使用 Windows 套接字 API 编程。 其中一个类 CSocket
提供了高级别的抽象来简化网络通信编程。
Windows 套接字规范 Windows 套接字:Microsoft Windows 下的网络计算开放接口(现为版本 1.1)由 TCP/IP 社区中的一大群个人和公司开发为开放网络标准,可供自由使用。 套接字编程模型目前使用 Internet 协议套件支持一个“通信域”。 该规范在 Windows SDK 中可用。
小窍门
由于套接字使用 Internet 协议套件,因此它们是支持“信息高速公路”上 Internet 通信的应用程序的首选路由。
套接字定义
套接字是通信终结点 - Windows 套接字应用程序通过该终结点跨网络发送或接收数据包。 套接字具有一个类型,并且与正在运行的进程相关联,并且它可能具有名称。 目前,套接字通常只与同一“通信域”中的其他套接字交换数据,该套接字使用 Internet 协议套件。
这两种套接字都是双向的;它们都是可以同时在两个方向上通信的数据流(全双工)。
有两种类型的套接字可用:
流套接字
流套接字提供没有记录边界的数据流:字节流。 保证交付流,并保证正确排序流且不重复流。
数据报套接字
数据报套接字支持面向记录的数据流,该数据流不能保证交付,也不能作为已发送或未重复进行排序。
“Sequenced”表示数据包按照发送顺序进行传递。 “未重复”是指一次只能获取一个特定数据包。
注释
在某些网络协议(如 XNS)下,数据流可以是面向记录的,即是记录流而不是字节流。 在较为常见的 TCP/IP 协议下,数据流是字节流。 Windows 套接字提供独立于基础协议的抽象级别。
有关这些类型以及在哪种情况下要使用的套接字的信息,请参阅 Windows 套接字:流套接字 和 Windows 套接字:数据报套接字。
SOCKET 数据类型
每个 MFC 套接字对象都封装 Windows 套接字对象的句柄。 此句柄的数据类型是 SOCKET。 SOCKET 句柄类似于窗口的 HWND
。 MFC 套接字类提供封装句柄上的操作。
Windows SDK 中详细介绍了 SOCKET 数据类型。 请参阅 Windows 套接字下的“套接字数据类型和错误值”。
套接字使用
套接字在至少三个通信上下文中特别有用:
客户端/服务器模型。
点对点场景,例如消息传递应用程序。
通过让接收应用程序将消息解释为函数调用,进行远程过程调用(RPC)。
小窍门
使用 MFC 套接字的理想案例是在编写通信的两端时:在两端使用 MFC。 有关本主题的详细信息,包括如何在与非 MFC 应用程序通信时管理案例,请参阅 Windows 套接字:字节排序。
有关详细信息,请参阅 Windows 套接字规范:ntohs、ntohl、htons、htonl。 另请参阅以下主题: