1 /*--------------------------------------------------------------------------
2   Project:  Horizon
3   File:     rdt.h
4 
5   Copyright (C)2010 Nintendo Co., Ltd..  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 28630 $
14  *-------------------------------------------------------------------------*/
15 
16 #ifdef _WIN32
17 #include <stdafx.h>
18 #endif
19 
20 #ifndef NN_RDT_H_
21 #define NN_RDT_H_
22 
23 /*!
24     @namespace  nn::rdt
25     @brief      RDT(信頼性のあるローカル通信)の名前空間です。
26 
27 概要:
28 RDTライブラリは、UDSライブラリの機能を利用して、信頼性のあるデータ通信
29 (データの破損や欠落の無い通信)を実現するためのクラスライブラリです
30 (UDSの上に構築されたRDTは、ちょうどIPの上に構築されたTCPのようなものといえます)。
31 RDTは、数十KByteを超えるような、ある程度大きなデータを送受信する際に
32 使われることを想定してデザインされています。
33 一方、1KByteに届かないような小さなサイズのデータを頻繁に送受信するような
34 ケースでは、あまり良いパフォーマンスは得られません。
35 
36 Senderクラス:
37 データ送信側を表現するクラスです。後述するReceiverクラスに宛てて
38 データを送信します。Senderクラスにはデータの再送機能などが実装されて
39 おり、通信路においてパケット喪失などの障害が発生しても、データを欠落
40 させることなく受信側に届けます。
41 
42 Receiverクラス:
43 データ受信側を表現するクラスです。前述のSenderクラスから送信された
44 データを受信します。受信側は送信側に向けて、適宜応答確認を行いつつ、
45 届いたデータを正しい順序で組み立てます。
46 
47 UDSのセットアップ:
48 アプリケーションはRDTを利用する前に、UDSをセットアップする必要があります。
49 すなわち、ネットワークの作成と、作成されたネットワークへの接続を済ませ、
50 UDSによるデータ通信が可能な状態としてからRDTの初期化処理を開始して
51 ください。UDSのセットアップはアプリケーション側の責任です。作成した
52 ネットワークの解放処理についても同様です。
53 
54 特徴:
55 RDTクラスライブラリでは、実データの流れは一方通行(@ref Sender から
56 @ref Receiver へ)です。もしデータを双方向にやりとりする場合は、
57 SenderとReceiverのペアをもう一組作成する必要があります。
58 
59 非ブロッキング動作:
60 RDTクラスライブラリにおける関数呼び出しは、非ブロッキングで動作します。
61 Sender::Open(), Receiver::Wait(), Sender::Send(), Receiver::Receive() などの
62 関数呼び出しは、すぐに返ります。実際に送受信処理を行う関数は、双方のクラスに
63 用意されているProcess()関数で実行されます。
64 
65 Process()関数:
66 アプリケーションは、少なくとも毎ゲームフレーム程度の周期でProcess()関数を
67 呼び出してください。Process()関数を定期的に呼び出さないと、実際の通信処理や、
68 状態遷移は実行されません(※Cancel()関数などの動作は例外です)。
69 なお、Process()関数を数回ほど連続して呼び出すことで、送受信のパフォーマンスを
70 上げられる場合があります。
71 
72 メモリ確保:
73 RDTライブラリの内部では、動的なメモリ確保は行いません。
74 ライブラリが必要とするメモリは、Initialize()関数呼び出し時にアプリケーションが
75 与えてください。このとき、メモリのアライメントに注意してください。
76 
77 
78 注意点:
79 RDTライブラリは、SenderまたはReceiverインスタンス1個につき、暗黙的に
80 nn::uds::EndpointDescriptor を2つ消費します。
81 
82 
83 
84  */
85 
86 /*!
87     @namespace  nn::rdt::CTR
88     @brief      CTR の RDT(信頼性のあるローカル通信)の名前空間です。
89 */
90 
91 #include <nn/rdt/CTR/rdt_define.h>
92 #include <nn/rdt/CTR/rdt_Sender.h>
93 #include <nn/rdt/CTR/rdt_Receiver.h>
94 #include <nn/rdt/CTR/rdt_Result.h>
95 #include <nn/rdt/CTR/rdt_Misc.h>
96 
97 namespace nn
98 {
99 namespace rdt
100 {
101 using namespace nn::rdt::CTR;
102 }
103 }
104 
105 
106 #endif  // end of NN_RDT_H_
107