DirectPlay
DirectPlay是微软DirectX套件中的一个网络通信组件, 为开发者提供多人游戏与聊天程序所需的底层网络支持。它在应用程序与具体通信服务之间提供一层高层软件接口, 使游戏能够通过互联网、调制解调器或局域网互相连接, 并负责会话创建、玩家管理以及网络地址转换(NAT)穿透等事务。该组件自DirectX早期版本起随套件分发, 先后出现DirectPlay 4与DirectPlay 8等版本, 后因Windows Live等在线服务兴起而被微软弃用, 目前仅在Windows中作为兼容性特性保留。
定义
DirectPlay是随微软DirectX应用程序编程接口一起分发的网络通信库, 属于DirectX的组件之一。它在应用程序与通信服务之间充当高层软件接口, 使游戏能够方便地通过互联网、调制解调器链路或局域网建立连接[1]。
该接口主要面向计算机游戏的网络功能开发, 但由于其通用性, 也可用于其他需要程序间通信的场合。它提供一组工具, 让玩家能够查找游戏会话, 并让站点管理主机与玩家之间的信息流动[2]。按网络层次划分, DirectPlay 大致对应OSI模型的第 4 层与第 5 层, 并建立在用户数据报协议(UDP)之上[3]。
原理
DirectPlay 采用组件对象模型(COM)实现, 应用程序通过 COM 接口调用其功能[2]。底层通信建立在 UDP 之上, 以获得较快的传输速度; 在第 4 层, 它可以按应用要求提供消息排序、消息可靠送达和流量控制等能力, 在第 5 层则始终负责会话管理等工作[2]。
对开发者而言, 主要入口包括 IDirectPlay8Server、IDirectPlay8Client 与 IDirectPlay8Peer 三个接口, 分别对应服务器、客户端与点对点三种角色的功能。此外还有负责在大厅中查找和准备游戏的大厅接口、用于穿透路由器的网络地址转换(NAT)接口、线程管理接口, 以及名为 DirectPlay Voice 的语音通信接口[2]。
DirectPlay 通过服务提供者(Service Provider)结构把应用逻辑与具体网络协议隔离开来, 因此同一个游戏可以经由不同协议或链路建立会话[4]。在点对点会话中, 会话的元数据由被指定为主机(host)的一方维护, 包括玩家列表与分组列表; 当主机退出时, 协议会执行主机迁移, 由另一名参与者接替其角色[1]。
发展历程
DirectPlay 随 DirectX 套件一同推出, 时间可追溯到 1995 年, 当时联网游戏面临协议繁杂的问题, 不同在线服务使用不同协议, 游戏往往只能支持其中一种[5]。DirectPlay 4 实现了 IDirectPlay4 接口, 首次随 DirectX 6 多媒体工具包发布, 其后一直分发到 DirectX 9[1]。
DirectPlay Voice 在 Windows Me 时期作为 DirectX 7.1 的一部分引入, 是一套语音通信、录制与回放接口, 使游戏可以在 DirectPlay 网络会话内实现语音聊天[2]。DirectPlay 8 实现 IDirectPlay8 接口, 随 DirectX 8 软件开发工具包首发, 被重写为较轻盈的网络库[1]。2002 年, DirectX 8.2 对网络协议进行了一次较大幅度的改造, 以更适合互联网对战[5]。
随着微软在 2004 年公布 XNA, 公司表示 DirectPlay 将被 Windows 平台的在线游戏技术取代而走向弃用[2]。2004 年微软将 DirectPlay 标记为弃用, 并从 DirectX SDK 中移除了相关接口文档, 不过 DirectX 9.x 仍随附其支持[5]。2007 年秋季之后, 微软发布的 DirectX SDK 中已不再包含供开发者使用的头文件与库[3]。
在 Windows Vista 中, DirectPlay 已被弃用, DirectPlay Voice 与 DirectPlay 的网络地址转换辅助组件被移除[2]。在 Windows 8.x 与 Windows 10 上, DirectPlay 变成可选功能, 默认不启用, 需要由用户手动开启[6]。其动态链接库仍在较新的 Windows 版本中随系统分发, 但目的仅是维持旧程序的兼容性, 开发用的库已不再随开发工具与软件开发工具包提供[1]。
应用
DirectPlay 的主要用途是为多人游戏提供会话创建、查找与连接能力, 支持点对点架构与客户端/服务器架构两类会话。连接建立后, 应用可以向其他玩家发送有保证或不做保证的消息, 并可通过 DirectPlay Voice 在游戏内进行语音通信[7]。除游戏本身外, 该组件也被用于大厅类客户端程序, 例如早期的桌面游戏大厅与即时通讯软件中的游戏匹配功能[6]。
DirectPlay 9.0 版本增加了对 Pocket PC 2002 设备的支持, 该版本可以与 DirectPlay 8.0 程序互通[7]。由于大量早期流行游戏依赖该技术进行联网对战, 兼容层项目也为其提供支持: Wine 9.22 开发版本在 2024 年 11 月发布, 其中包含了对 DirectPlay 网络会话的更多支持[8]。
局限
DirectPlay 已被微软弃用, 官方建议在新项目中不再使用。其开发用的头文件与库最后出现在 2007 年 8 月的旧版 DirectX SDK 中, 任何 Windows SDK 都不再包含它[6]。
在功能层面, DirectPlay Voice 在 Windows Vista 及更高版本系统中不受支持, 网络地址转换辅助对象在这些系统上同样不受支持[6]。此外, DirectPlay 只有 32 位实现, 微软未发布 64 位运行时[9]。
该技术原有的价值在于应对协议多样且不断变化的网络环境, 包括调制解调器对战、串口直连、IPX/SPX 与 TCP/IP 等; 当 TCP/IP 成为事实上的唯一选项后, 直接使用套接字接口在控制力与开销上更为可取, 其大厅机制也已显得过时[6]。2004 年还曾出现影响 DirectPlay 4 的拒绝服务问题, 构造的恶意数据包可导致使用该组件的程序异常中止, 微软为此发布了修复程序[10]。
参见
参考资料
- [MC-DPL4CS]: Glossary - 跳至主要内容 跳到 Ask Learn 聊天体验 [引用日期2026-10-14]
- DirectPlay [引用日期2026-10-14]
- DirectPlay [引用日期2026-10-14]
- DirectPlay [引用日期2026-10-14]
- DPlay - Wireshark Wiki [引用日期2026-10-14]
- Cannot open include file dplay8.h .No such file or directory [引用日期2026-10-14]
- DirectPlay [引用日期2026-10-14]
- Wine 9.22 Released [引用日期2026-10-14]
- Olde-Skuul/directplay: Directplay SDK for Windows · GitHub [引用日期2026-10-14]
- Objet: Vulnérabilité de DirectPlay [引用日期2026-10-14]