1 / 78

DirectPlay8 In Depth Michael Narayan Development Lead DirectPlay Core Microsoft Corporation

DirectPlay8 In Depth Michael Narayan Development Lead DirectPlay Core Microsoft Corporation. 概要. DirectPlay8 のアーキテクチャ API の使用方法 動作仕様 よくある問題 DirectPlay8 プロトコル. DirectPlay8 のアーキテクチャ 概要. アプリケーション. コールバック. API 呼び出し. DirectPlay8. ネットワーク. DirectPlay8 のアーキテクチャ コンポーネント. ロビー クライアント.

Download Presentation

DirectPlay8 In Depth Michael Narayan Development Lead DirectPlay Core Microsoft Corporation

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DirectPlay8 In Depth Michael NarayanDevelopment LeadDirectPlay Core Microsoft Corporation

  2. 概要 • DirectPlay8 のアーキテクチャ • API の使用方法 • 動作仕様 • よくある問題 • DirectPlay8 プロトコル

  3. DirectPlay8 のアーキテクチャ概要 アプリケーション コールバック API 呼び出し DirectPlay8 ネットワーク

  4. DirectPlay8 のアーキテクチャコンポーネント ロビー クライアント ロビー クライアント アプリケーション ロビー コア DPNSVR プロトコル サービス プロバイダ ネットワーク

  5. API の使用方法

  6. Initialize() • DirectPlay を使用する前にこれを呼び出す必要がある • メッセージ ハンドラ機能 • コンテキスト値はインターフェイスごとに一意 • メッセージ ハンドラまたはコンテキスト値を変更することはできない

  7. Close() • Initialize() と対になる呼び出し • Close() の後に Initialize() を呼び出し可能 • Release() は Close() を呼び出す • 同期型 • コールバックが発生する場合がある • 未処理の操作を完了させる • メッセージ ハンドラ関数から Close() を呼び出すことはできない

  8. EnumServiceProviders() • ある特定のサービス プロバイダ用のサービス プロバイダ (SP) とアダプタを列挙する • どの SP が使用可能かを確認する • DirectPlay8 は SP のロードを試みる • どの SP がインストールされているかを確認する • DPNENUMSERVICEPROVIDERS_ALL を使用する • 2 回呼び出す (サイズとデータ)

  9. Host() • 複数のデバイス アドレスを指定可能 • SP だけを特定してアドレスを指定可能 • DPNHOST_OKTOQUERYFORADDRESSINGフラグを設定するとダイアログ ボックスが表示される • ポートを指定しない場合、DirectPlay が 2302 ~ 2400 の間から選択する • DPNSVR は 6073 で待機する

  10. Host() (続き) • 同期 • 戻る前にすべての待機が開始する • 戻る前に列挙の問い合わせを受け取り可能 • ホスト プレーヤーがメッセージ ハンドラに送信されるように CREATE_PLAYER 通知を生成する

  11. EnumHosts() • 同期または非同期 • 複数の同時列挙が可能 • コンテキスト値で区別する • 既知のホストをブロードキャストまたはターゲットにする • 指定がない場合は DPNSVR ポート (6073) を使用する • 指定がない場合はすべてのアダプタが使用される • DPNENUMHOSTS_OKTOQUERYFORADDRESSINGフラグを設定するとダイアログ ボックスが表示される

  12. EnumHosts() (続き) • アプリケーション データをサーバーに送信する • 列挙パケット全体がフレーム内に収まっている必要がある (IP で約 1,300 バイト) • 最大ペイロード サイズを確認するには GetSPCaps() を使用する typedef struct _DPN_SP_CAPS { … DWORD dwDefaultEnumCount; DWORD dwDefaultEnumRetryInterval; DWORD dwDefaultEnumTimeout; DWORD dwMaxEnumPayloadSize; … } DPN_SP_CAPS, *PDPN_SP_CAPS;

  13. EnumHosts() (続き) • 非同期完了/終了 • タイムアウト • CancelAsyncOperation() でのキャンセル • メッセージ ハンドラから DPN_OK 以外の値を返すことによるキャンセル (DPN_MSGID_ENUM_HOSTS_RESPONSE) • ホストへの正常な接続 • Close() の呼び出し

  14. EnumHosts() (続き) • 同期完了/終了 • タイムアウト • メッセージ ハンドラから DPN_OK 以外の値を返すことによるキャンセル (DPN_MSGID_ENUM_HOSTS_RESPONSE) • ホストへの正常な接続 • Close() の呼び出し

  15. Connect() • 同期または非同期 • 必須なのはホスト アドレスのみ • デバイス アドレスは、指定がない場合はホスト アドレスから取り出される • ホスト アドレスは既知または EnumHosts() で検出する • 指定がない場合はすべてのアダプタが使用される • DPNCONNECT_OKTOQUERYFORADDRESSINGを設定するとダイアログ ボックスが表示される

  16. Connect() (続き) • DPN_MSGID_ENUM_HOSTS_RESPONSE通知のホスト アドレスとデバイス アドレスを使用する typedef struct _DPNMSG_ENUM_HOSTS_RESPONSE { DWORD dwSize; IDirectPlay8Address *pAddressSender; IDirectPlay8Address *pAddressDevice; const DPN_APPLICATION_DESC *pApplicationDescription; PVOID pvResponseData; DWORD dwResponseDataSize; PVOID pvUserContext; DWORD dwRoundTripLatencyMS; } DPNMSG_ENUM_HOSTS_RESPONSE;

  17. Connect() (続き) • アプリケーション データをホストに渡す、またはホストから受け取ることができる • すべてのアダプタで最初に成功した接続 • その他はキャンセルされる • 接続に成功すると : • 未処理の列挙をすべてキャンセルする • DPN_MSGID_CONNECT_COMPLETE 通知を生成する

  18. Connect() (続き) • IDirectPlay8Peer::Connect() • DPN_MSGID_CREATE_PLAYER通知が常に生成される • ローカル プレーヤーのコンテキスト値を事前設定するには、pvPlayerContextを使用する • プレーヤーが完全にセッション状態に入った時点で完了する

  19. Connect() (続き) • IDirectPlay8Client::Connect() • DPN_MSGID_CREATE_PLAYER通知は生成されない • プレーヤーがサーバーに接続された時点で完了する

  20. Send() / SendTo() • IDirectPlay8Client::Send() • IDirectPlay8Server::SendTo() • IDirectPlay8Peer::SendTo() • SendTo() requires DPNID of target • クライアントはサーバーについて知っているだけで、ほかのプレーヤーをターゲットにできない

  21. Send() / SendTo() (続き) • 同期または非同期 • ベスト プラクティスは非同期 • 以下の指定が可能 : • 保証付き / 保証なし • シーケンシャル / 非シーケンシャル • 標準 / 高い / 低い優先順位 • 完了 / 非完了 (非同期の場合) • デフォルト : 保証なし、シーケンシャル、標準優先順位、完了

  22. Send() / SendTo() (続き) • DPNSEND_NOCOPYを指定した場合 : • 送信が完了するまで DirectPlay が送信バッファを所有する • アプリケーションはバッファの内容を変更 (またはバッファを解放) してはならない • 送信バッファをスタックに割り当てない • ベスト プラクティス – memcpy() 呼び出しを頻繁に使用しない

  23. Send() / SendTo() (続き) • DPNSEND_COMPLETEONPROCESSを指定した場合 : • 受信側のメッセージ ハンドラが起動するまで完了は送信されない • 処理は保証されない

  24. Send() / SendTo() (続き) • 次の時点で完了を送信 : • ワイヤ上への送出 (保証なし) • 受信側による ACK (確認応答) (保証付き) • タイムアウト • 受信側のメッセージ ハンドラによる処理 (DPNSEND_COMPLETEONPROCESS) • DPNSEND_NOCOMPLETEが指定されていない限り、すべての非同期送信が完了する • DPNSEND_NOCOPYが指定されている場合に送信バッファを解放するには、完了を使用する

  25. 動作仕様

  26. 動作仕様 • セッションのホスト • セッションの列挙 • セッションへの接続 • データの送信 • データの受信 • 削除された接続 • ホストの移行

  27. セッションのホスト • DirectPlay は次のことを行う : • DPNSVR を起動する (要求された場合) • 列挙の問い合わせを待機する • 着信接続を待機する • ローカル プレーヤーに対するDPN_MSGID_CREATE_PLAYER通知をメッセージ ハンドラに送信する • セッション情報を更新して戻る

  28. ホスト (続き) • DPNSVR : • UDP ポート 6073 で列挙の問い合わせを待機する • 列挙の問い合わせをアプリケーション GUID に基づいて適切なアプリケーション (ポート) に転送する • ホストは列挙の応答をクライアントに直接送信する (DPNSVR を経由しない) • DPNSVR はシステムあたり 1 インスタンス • 10 分間無通信になると自動終了する • 強制終了するには : dpnsvr /kill

  29. ホスト (続き) • 列挙の問い合わせ : • DPN_MSGID_ENUM_HOSTS_QUERYがメッセージ ハンドラに送信される typedef struct _DPNMSG_ENUM_HOSTS_QUERY { DWORD dwSize; IDirectPlay8Address *pAddressSender; IDirectPlay8Address *pAddressDevice; PVOID pvReceivedData; DWORD dwReceivedDataSize; DWORD dwMaxResponseDataSize; PVOID pvResponseData; DWORD dwResponseDataSize; PVOID pvResponseContext; } DPNMSG_ENUM_HOSTS_QUERY;

  30. ホスト (続き) • 列挙の問い合わせ : • 事前にフィルタ処理され、アプリケーション GUID、インスタンス GUID (指定されている場合) の一致を保証する • ホストはメッセージ ハンドラが DPN_OK を返した場合にのみ応答を生成する • 送信側のアドレスがホストに知らされる • 列挙の問い合わせが着信したデバイスのアドレスがホストに知らされる

  31. ホスト (続き) • 列挙の問い合わせ : • クライアントは、pvReceivedData、dwReceivedDataSize を使用して列挙データをホストに送信する • ホストは、pvResponseData、dwResponseDataSizeおよび pvResponseContext を使用して応答を送信する • 応答のサイズはdwMaxResponseDataSizeに制限されなければならない • 応答は一致するコンテキストを持つDPN_MSGID_RETURN_BUFFERを生成する

  32. ホスト (続き) • 着信接続 : • DPN_MSGID_INDICATE_CONNECTがメッセージ ハンドラに送信される typedef struct _DPNMSG_INDICATE_CONNECT { DWORD dwSize; PVOID pvUserConnectData; DWORD dwUserConnectDataSize; PVOID pvReplyData; DWORD dwReplyDataSize; PVOID pvReplyContext; PVOID pvPlayerContext; IDirectPlay8Address *pAddressPlayer; IDirectPlay8Address *pAddressDevice; } DPNMSG_INDICATE_CONNECT;

  33. ホスト (続き) • 着信接続 : • 事前にフィルタ処理され、アプリケーション GUID、インスタンス GUID、パスワード、可用性の一致を保証する • ホストはメッセージ ハンドラが DPN_OK を返した場合にのみ接続を受け付ける • 受け付けられた接続によってDPN_MSGID_CREATE_PLAYERまたは DPN_MSGID_INDICATED_CONNECT_ABORTEDが発生する • リソースを事前割り当てする • pvPlayerContext を事前設定する

  34. ホスト (続き) • 着信接続 : • クライアントは、pvUserConnectData、dwUserConnectDataSizeを使用して接続データをホストに送信する • ホストは、pvReplyData、dwReplyDataSize、pvReplyContextを使用して応答データをクライアントに送信する • 応答は常に送信される (接続がホストによって拒否された場合でも) • 応答は一致するコンテキストを持つ DPN_MSGID_RETURN_BUFFERを生成する

  35. セッションへの接続 • IDirectPlay8Client::Connect() • DirectPlay は 1 つの接続 (サーバー) を実行する • IDirectPlay8Peer::Connect() • DirectPlay は複数の接続 (ホストとその他のプレーヤー) を実行する

  36. 接続の構造 • 接続は SP レイヤで確立される • プロトコル レイヤに指示が提供される • プロトコル レイヤでの 3 方向交換 • ラウンドトリップ時間の計算に必要 • リンク速度の最初の指示 • コア レイヤに指示が提供される • コア レイヤでの 3 方向交換 • プレーヤーおよびセッションの情報を交換する

  37. 接続 (続き) • IDirectPlay8Client::Connect() • サーバーへの接続が確立される • 接続情報が検証のためにサーバーに送信される • サーバーがネーム テーブルまたは失敗応答を返す • クライアントがネーム テーブルをインストールする • クライアントがネーム テーブルを ACK (確認応答) する • 完了が結果および可能な応答と共にメッセージ ハンドラに送信される

  38. 接続クライアントが接続に成功する アプリケーション DirectPlay8 DirectPlay8 アプリケーション Connect() プロトコル接続 接続を 指示 接続データ ネーム テーブル ネーム テーブルの ACK 接続 完了 プレーヤーを 作成 (クライアント)

  39. 接続 (続き) • IDirectPlay8Peer::Connect() • ホストとの接続が確立される • 接続情報が検証のためにホストに送信される • ホストは参加するプレーヤーにネーム テーブルまたは失敗応答を送信し、既存のプレーヤーにネーム テーブルの更新情報を送信する • 参加するプレーヤーがネーム テーブルをインストールする • 参加するプレーヤーのメッセージ ハンドラにホストおよび参加するプレーヤーの DPN_MSGID_CREATE_PLAYER通知が送信される • 参加するプレーヤーがホストに対してネーム テーブルを ACK (確認応答) する

  40. 接続 (続き) • IDirectPlay8Peer::Connect() (続き) • 参加するプレーヤーに関する DPN_MSGID_CREATE_PLAYER通知が、ホストのメッセージ ハンドラに送信される • ホストが既存のプレーヤーに対して、参加するプレーヤーへの接続を指示する • 既存のプレーヤーが、参加するプレーヤーに接続する • 参加するプレーヤーに関する DPN_MSGID_CREATE_PLAYER通知が、既存のプレーヤーのメッセージ ハンドラに送信される

  41. 接続 (続き) • IDirectPlay8Peer::Connect() (続き) • 既存のプレーヤーに関する DPN_MSGID_CREATE_PLAYER通知が、参加するプレーヤーのメッセージ ハンドラに送信される • 完了が結果および可能な応答と共にメッセージ ハンドラに送信される • 既存のプレーヤーが参加するプレーヤーに接続できない場合、接続操作全体が DPNERR_PLAYERNOTREACHABLE で失敗する

  42. 接続ピアが接続に成功する 新しい プレーヤー ホスト プレーヤー 既存の プレーヤー 接続情報 ネーム テーブル ネーム テーブル更新 プレーヤーを作成 (新しいプレーヤー、ホスト) ネーム テーブルの ACK 接続の指示 プレーヤーを作成 (新しいプレーヤー) プレーヤーを作成 (新しいプレーヤー) 新しいプレーヤーに接続 プレーヤーを作成 (既存のプレーヤー)

  43. 接続 (続き) • 接続完了は常に生成される • 同期接続または失敗した接続の場合でも • ホストからの応答が含まれる • クライアントは、DPN_MSGID_CONNECT_COMPLETEが送信された後にのみメッセージを送受信できる • ピアは、DPN_MSGID_CREATE_PLAYERが送信された後にのみメッセージを送受信できる

  44. データの送信 • SendTo() / Send() を呼び出すと • DirectPlay のコア レイヤは送信バッファのコピーを作成する (DPNSEND_NOCOPY フラグが指定されていない場合) • コア レイヤは送信バッファをプロトコル レイヤに渡す • プロトコル レイヤは送信をフレームに分割し、サービス プロバイダ レイヤにフレームを渡す • サービス プロバイダ レイヤはフレームをワイヤ上に送出する

  45. データの送信 (続き) • 保証なしの送信 • データがワイヤ上に送出されると直ちに送信完了 (DPN_MSGID_SEND_COMPLETE) がメッセージ ハンドラに送信される • 保証付き送信 • 受信側からデータ受け取りの ACK (確認応答) があった時点で送信完了がメッセージ ハンドラに送信される • 受信側への配信だけは保証する • 受信側のメッセージ ハンドラに対する指示、または処理は保証しない

  46. データの送信 (続き) • 処理完了の送信 • 受信側のメッセージ ハンドラが DPN_MSGID_RECEIVE 通知から戻った時点で送信完了がメッセージ ハンドラに送信される • DirectPlay によって見えないところで処理される • アプリケーションはこの機能を実装する必要はない

  47. データの送信 (続き)保証付き送信の例 フレーム アプリケーション DirectPlay8 DirectPlay8 アプリケーション SendTo() ACK (確認応答) メッセージ ハンドラ (送信 完了) メッセージ ハンドラ (受信)

  48. データの送信 (続き) • DirectPlay は送信されたメッセージを調整する • 受信側の処理速度 • リンクの転送特性 • 受信側の処理速度はアプリケーションの設計に依存する • サービスを提供するメッセージ ハンドラの通知 (DPN_MSGID_RECEIVE) の速度

  49. データの送信 (続き) • 転送特性の例 : • 物理接続の制限 (モデム、LAN、DSL など) • 一時的な条件 (ネットワーク切断、混雑など)

More Related