标题：DirectPlay
介绍
相关影像Microsoft DirectPlay API为开发者提供了开发诸如多人游戏或聊天程序的工具,它是Microsoft DirectX®的组件之一。DirectPlay完成了与用户连接相关的所有复杂工作，使那些后台网络地址转化(NAT)设备保持一致，并管理会话。它允许你创建、查找、连接多人游戏。连接以后，DirectPlay可以让你向其他玩家发送已验证或未验证的信息。这是作为一个网络应用程序最其本的框架，并且还提供了在游戏中传输语音的功能。9.0新增内容，DirectPlay提供支持Microsoft Windows® Powered Pocket PC 2002，并能与DirectPlay8.0的程序进行通讯DirectPlay基本概念Microsoft® DirectPlay® API提供给开发者开发例如游戏或聊天客户端的多人应用程序的工具。简单起见，本文件将把所有这样的程序叫做“游戏”。一个多人应用程序有两个基本特征：
两个或多个单独的用户，每一个都在它们的计算机上具有一个游戏客户端。 
网络联接使得用户的计算机可以与其它人通信，或许通过一个中央服务器。 
DirectPlay提供了一个额外的层，使你的游戏和网络底层相隔。并且，你的游戏可以非常简单的使用DirectPlay API，并使用DirectPlay管理网络通讯。
特性
DirectPlay特性DirectPlay提供的特性，使多人游戏在开发中得到了很多简化。其中包括：
1 创建和管理点对点，客户/服务会话（Session）
2 在一个会话中管理用户（User）和组(Group)
3 管理在不同网络平台上进行会话的成员之间发送的消息
4 使游戏在大厅（Lobby）中互动
5 使用户可以进行语音互动
这部分的文档（Introduction To DirectPlay）高度概括了DirectPlay的功能。随后的章节将告诉你DirectPlay的细节和如何在你的游戏中使用DirectPlay。
DirectPlay Network Communication 
Communicating with DirectPlay Objects 
Creating and Managing Sessions
DirectPlay9.0新特性DirectPlay应用程序接口（APIs）可以运行在Microsoft Windows® Powered Pocket PC 2002系统上。详细内容请查看DirectPlay for Pocket PC 2002。 
DPN_MSGID_SEND_COMPLETE消息结构允许你利用其内部的两个成员在短时间内进行消息往返性质的传输。 
DirectPlay提供一个新的网络服务层，你可以使用IDP8SimControl的方法去调试一个多样性的网络环境(PS:我认为这里是说在一个应用程序中同时使用多个协议) DirectPlay has a new service provider for network simulation. You can use the IDP8SimControl methods to test applications under a variety of network conditions. 
DirectPlay有一个新的接口，IDirectPlay8ThreadPool,它允许你管理应用程序中的多个线程。 
应用程序可以取消所有消息发送，前提是一个特殊的玩家在调用以下几个函数中使用了DPNCANCEL_PLAYER_SENDS标志位
IDirectPlay8Peer::CancelAsyncOperation, IDirectPlay8Server::CancelAsyncOperation, IDirectPlay8Client::CancelAsyncOperation. 
玩家们可以在DPN_MSGID_CONNECT_COMPLETE消息中接收他们的本地玩家标识符（ID）. 
主机可以预防从进程枚举中提取到被设置为DPNSESSION_NOENUMS 标志位的DPN_APPLICATION_DESC结构。该消息在调用IDirectPlay8Peer::Host and IDirectPlay8Server::Host时发出. 
如果消息发送到一个没有任务玩家的组中，它将马上返回DPNSUCCESS_NOPLAYERSINGROUP以替代了原来的DPNERR_GENERIC. 
信息包的签名可用在所有DirectPlay通信上。 
在调用以下几个方法时，将标志位设置为DPNCLOSE_IMMEDIATE，那么该应用程序可以被立即关闭。
IDirectPlay8Peer::Close,
IDirectPlay8Client::Close,
IDirectPlay8Server::Close. 
DirectPlay 9.0 增强了反向连接欺骗的防御措施 
在以下方法中使用DPNINITIALIZE_HINT_LANSESSION 标志位初始化 IDirectPlay8Peer::Initialize,
IDirectPlay8Client::Initialize,
IDirectPlay8Server::Initialize. 
在调用发送信息的函数时，信息包是可以被连接合并的。只要在以下函数中设置DPNSEND_COALESCE标志位
IDirectPlay8Peer::SendTo,
IDirectPlay8Client::Send,
IDirectPlay8Server::SendTo. 
应用程序可以利用DPN_CAPS_EX结构对DirectPlay的协议进行调整。适用函数：IDirectPlay8Peer::GetCaps,IDirectPlay8Client::GetCaps,
IDirectPlay8Server::GetCaps,IDirectPlay8Peer::SetCaps,
IDirectPlay8Client::SetCaps,IDirectPlay8Server::SetCaps. 
当一个组被加入到DPNMSG_CREATE_GROUP结构中，就会拥有上下关联的值。 
如果在调用IDirectPlay8Peer::Host或者 IDirectPlay8Server::Host方法时，没有在DPN_APPLICATION_DESC结构中设置DPNSESSION_NODPNSVR标志位，并且没有运行dpnsvr.exe，那么创建主机的行为将会出错并返回DPNERR_DPNSVRNOTAVAILABLE. 
Less reliable connections should now perform better with improved DirectPlay protocol behavior. 
Network Address Translation (NAT) support has improved. This includes the new IDirectPlay8NATResolver interface, which allows you to create a NAT resolver application. 
DirectPlay now supports Internet Protocol (IP) v6.
网络通讯
DirectPlay点对点布局一个点对点游戏由单独的玩家计算机组成，用网络连接进行连接。示意，一个四玩家点对点游戏布局看起来是这样：
Gameplay通过具有每一用户的游戏客户端与其它用户客户端直接通信进行控制。例如，当一个用户移动，这一游戏客户端必须发送三条更新消息，每一条发送到每一个其它用户计算机。
一个点对点游戏通常被组织和加载于一个用户计算机上的大厅客户端程序。大顶客户端能够组织一个会话有两个基本方法：
大厅客户端与其它潜在用户的大厅客户端直接进行通信。这一方案能被用于，例如，组织一个用户在同一局域网子网中的游戏。 
大厅客户工作于一个远程计算机上的大厅服务器程序的联接。这是基于互联网游戏通常的组织方法。 
一旦一个会话被设置好和启动，大部分或所有消息将是用户到用户的。如果一个大厅服务器被关联，它将仅仅控制这样的工作，比如当一个玩家离开游戏时更新会话成员列表，或者允许新的用户进入会话的请求。否则，服务器居于后台，并且特定情况下甚至不知道大部分正发出的消息。
因为服务器端或者是不存在的或者至少不直接与游戏进行有关，一个用户被设计为游戏主机。它们负责管理后勤的细节，如把新玩家带入正在进行的会话。
点对点游戏具有简单的优点。所有所需是一个招集玩家的游戏客户端，通过管理一个会话。点对点布局的主要缺点是数量性。随着用户数量增加，消息数量需要几何级的增长。用户数的最大值依赖于游戏和网络带宽，但是特定为不超过20-30。 
DirectPlay网络通讯协议提供了极其适用多用户游戏的大量特征： 
·可靠及不可靠的消息传递。可靠消息将一直重发直到对方接收； 
·连续及不连续的消息分发。连续消息会以发送时的顺序达到目的端； 
·消息分块及重组。如果消息大小超过了网络传输能力，DirectPlay会自动把这些消息分块（传输）并重组； 
·拥塞控制。DirectPlay可以自动“扼杀”Outgoing的消息以使得目标（程序）可以（及时）处理。 
（以上两条，其实就是解决两个问题，消息的大小，及单位时间内可以发送消息的个数） 
·发送优先级，以确保重要消息先发送。DirectPlay可以制定三种级别低（low）、中（medium）、高（high）。high优先级的消息在输出队列的前端，然后依次是medium及low优先级的消息。
DirectPlay网络能力的核心是DirectPlay协议。这一传输层协议完全兼容DirectPlay8，现在并且用于所有消息。DirectPlay协议关注于全你从发送程序到接收程序传送数据更简单，不需为两者间发生了什么犯愁。这一协议提供了一定数量的特性，以供应多人游戏的需求，包括：
消息的可靠和不可靠传输。可靠消息将被重新传输直到接收程序收到它们。你可以分配传输类型为message-by-message。 
消息的连续和不连续传输。连续消息将以它们发出时的顺序传送的接收程序。 
消息的分裂与组装。如果消息尺寸超过特定网络的能力，DirectPlay自动分裂组装消息。 
阻塞控制。DirectPlay自动扼杀你发出的消息到一个接收程序可以控制的极别。这一特性防止你因大最接收程序不能处理的消息所造成的消息泛滥。 
传输优先级。为了保证最重要的消息首先被发出。DirectPlay允许你指定消息为低、中、高优先级。高优先级的消息被发送到输出队列的最前面，其后是中、低优先级消息。 
消息超时设定。为了防止送出的消息队列被很多当前的消息延时的消息阻塞，DirectPlay允许你为所有消息设定一个超时值。当一个消息超时时，它被从发出消息队列（outgoing message queue）删除，不管它发没发出。
DirectPlay 地址为了能传递消息，多人游戏中，每个参与者都必须拥有一个唯一（可识别的）地址。 
地址可能会参照应用程序所在机器（设备地址）或者应用程序需要通信的机器（主机地址）而确定。 
DirectPlay地址的形式同URL串，由scheme、scheme分隔符及数据串组成：
为了传输消息，每一个多人游戏中的参与者必须具有一个唯一的地址。地址能涉及你的应用程序运行于其上的计算机（设备地址device address）或都你的应用程序需要通信的计算机（主机地址host address）两者。
DirectPlay地址是URL字符串格式。这些字符串由一个scheme(方案)、scheme separator(方案分离器)和数据字符串组成，具有下面通用的格式。
x-directplay:/[data string]
数据字符串包括不同的元素，以指定使发送者和接收者两者间能够发生通信所需要的任何东西，覆盖多种不同的网络连接类型。
在使用方面，URL字符串被传递到DirectPlay API方法或从DirectPlay API方法传递的DirectPlay地址对象所包含。你具有直接操作URL字符串或使用由地址对象暴露的方法以操作数据字符串分离出的每一个元素的选项。
与DirectPlay对象通信简介 
DirectPlay包括一个COM对象集。每个对象暴露了一个或多个使你能控制DirectPlay不同方面的一个或多个接口。比如，DirectPlay点（peer）对象(CLSID_DirectPlay8Peer)，就是负责管理点对点游戏的。
你通过调用DirectPlay对象接口所暴露的方法来和它通讯。比如，为了在点对点游戏给其它用户发送数据，你将调用IDirectPlay8Peer::SendTo方法发送一条消息。DirectPlay然后会在它的接收端处理接收消息的工作。
DirectPlay通过一个或多个callback functions（回调函数）与你的应用程序进行通信这些函数和windows程序使用的回调函数相似。你的应用程序初始化期间执行这些callback function并传递一个这个函数的指针。当DirectPlay需要与你的程序通讯时，它调用callback function，并且传递两个重要信息：
1 一个表明消息类别的消息标识(ID)。
2 一个数据块指针，代表一个结构体，提供任何需要的细节。
示例 
例如：
HRESULT WINAPI DirectPlayMessageHandler( PVOID pvUserContext, DWORD dwMessageId, 
PVOID pMsgBuffer)
{return S_OK;}
比如，当一个发送上面的信息的消息到目标，目标程序的callback function将接收到一条具有DPNMSGID_RECEIVE消息ID的消息，指示一条消息已经被其它用户收到。相伴的结构体包括了数据。
因为大多数的DirectPlay消息是多线程的，其中关键就是callback function如何被恰当的执行。
DirectPlay创建和管理会话一个游戏会话是一个特定的多人游戏的实例。一个会话具有两个或多个用户同时游戏，每个在他或她的计算机上具有同样的游戏客户端。一个玩家（player）是一个在游戏中自身的实体，并被特定游戏所定义。一个用户可能在一个游戏中具有不只一个的玩家角色。然而，游戏应用程序必须自己管理这些玩家，用对于每一个玩家单独的DirectPlay接口或对象。
创建会话的第一步就是集中一组用户。有两种方式：
1 大多数游戏会话都被一个运行在远程计算机上大厅程序（lobby application）所管理。这种方式被用于大多数基于Internet的游戏。
2、也可以通过单独的用户计算机与其它人的进行通信来管理游戏。这一方式被限定于一组所有潜在用户都在同一个局域网中的情况下。
一旦会话被建立，游戏就被启动并且游戏玩家开始游戏。游戏进行中，玩家可能离开会话或者新的玩家加入。细节取决于特定的游戏。
在多人游戏中，每一用户的用户界面（user interface (UI)）能被会话中的所有其它用户所同步。管理多玩家会话因而需要一个连续的从其它用户发出或到达其它用户的消息流。例如，每次一个玩家移动，一条消息必须被发送以在这一会话中的所有其它游戏客户端更新这一玩家的位置。DirectPlay的核心就是这一部分的API支持在所有在一个会话中的所有计算机间高效灵活的消息机制。
有两种基本的一个会话消息机制布局（topology）的结构的方法：一种是点对点，一种是客户/服务模式（peer-to-peer and client/server）。两种布局都有它们的优点和限制，因而你将需要评估哪一种更适合你的游戏。