CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
クラス nn::pia::transport::ReliableProtocol

到達保証された通信を行うプロトコルです。 [詳細]

+ nn::pia::transport::ReliableProtocolに対する継承グラフ

Public メソッド

void Finalize ()
 終了処理を行います。
 
Result Initialize (uint32_t sendBufferSize, uint32_t receiveBufferSize)
 インスタンスを初期化します。 BeginSetup()EndSetup() 間で呼び出す必要があります。
 
bool IsInCommunication (StationId stationId) const
 指定した相手と通信中かどうかを取得します。
 
Result Receive (StationId *pSourceStationId, void *pBuffer, uint32_t *pDataSize, uint32_t bufferSize)
 データを受信します。
 
Result Send (StationId destinationStationId, const void *pData, uint32_t dataSize)
 データを送信します。
 
Result SendToAll (const void *pData, uint32_t dataSize)
 データを全ステーションに向けて送信します。
 
void SetThroughputLimit (uint32_t throughputLimit)
 common::Scheduler::Dispatch の 1 回の呼び出しあたりにこのプロトコルが送信するデータ量の上限を指定します。
 
virtual void Trace (uint64_t flag) const
 デバッグに有用な情報をプリントします。
 

Static Public 変数

static const uint32_t ThroughputLimitMax = 0x0FFFFFFF
 SetThroughputLimit() で設定できる値の最大値です。
 

説明

到達保証された通信を行うプロトコルです。

関数

void nn::pia::transport::ReliableProtocol::Finalize ( )

終了処理を行います。

参照
Initialize
Result nn::pia::transport::ReliableProtocol::Initialize ( uint32_t  sendBufferSize,
uint32_t  receiveBufferSize 
)

インスタンスを初期化します。 BeginSetup()EndSetup() 間で呼び出す必要があります。

送信バッファ、受信バッファで実際に利用された数は common::WatermarkManagercommon::WatermarkManager::KeyReliableProtocolSendBufferNum および common::WatermarkManager::KeyReliableProtocolReceiveBufferNum を 指定することにより計測することができます。

ReliableProtocol が消費するおおよそのメモリ量は、以下の計算式で求められます(単位はバイト)。
(sendBufferSize * 1500 + receiveBufferSize * 1500) * (Transport::Setting::maxStationNum - 1)

引数
[in]sendBufferSize送信バッファのデータ数です。 1 以上の値を指定する必要があります。 送信バッファは Send() したデータを送信相手に届いたことが確認されるまで保持するために使われます。
[in]receiveBufferSize受信バッファのデータ数です。 1 以上の値を指定する必要があります。 受信バッファは、受信したデータを Receive() されるまで保持するために使われます。
戻り値
成功すれば、 IsSuccess() が true を返す Result が返されます。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
返るエラーの一覧:

ResultInvalidArgument 引数が誤っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。

ResultAlreadyInitialized 既に初期化されています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。

参照
Finalize
bool nn::pia::transport::ReliableProtocol::IsInCommunication ( StationId  stationId) const

指定した相手と通信中かどうかを取得します。

自分および指定した相手がセッション内に存在すれば true を返します。

引数
[in]stationId通信相手の StationId です。
戻り値
通信中なら true が返されます。
Result nn::pia::transport::ReliableProtocol::Receive ( StationId pSourceStationId,
void *  pBuffer,
uint32_t *  pDataSize,
uint32_t  bufferSize 
)

データを受信します。

common::Scheduler::Dispatch() のタイミングで受信したパケットは解析され、内部のバッファに蓄積されていきます。 Send() で分割されたデータがすべて届いていることが確認できているデータはこの関数で結合され取得できます。 内部バッファもこのタイミングで解放され、次の受信のために使われます。

引数
[out]pSourceStationId受信データの送信元の StationId を書き込むバッファへのポインタです。
[out]pBuffer受信データを書き込むバッファへのポインタです。
[out]pDataSize受信データのサイズを書き込むバッファへのポインタです。
[in]bufferSize受信データを書き込むバッファのサイズ(バイト)です。
戻り値
成功すれば、 IsSuccess() が true を返す Result が返されます。
返るエラーの一覧:

ResultInvalidState 初期化されていません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。

ResultInvalidArgument 引数が誤っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。

ResultNotInCommunication 通信中でありません。セッションに参加していない状態と同じです。アプリケーションで適切にハンドリングしてください。

ResultNoData 受信したデータはありません。アプリケーションで適切にハンドリングしてください。

ResultBrokenData 受信したデータが大きすぎて受信バッファに入りきらないか渡されたバッファに書ききれません。セッションのスタートアップからやり直す必要があります。 この Result はチートなどによって送信側が不正なデータを送ってきたときに発生する可能性があるため実行時にハンドリングする必要がありますが、 送信側の挙動が正常な場合はこの Result が返らないようにプログラムを修正する必要があります。アプリケーションで適切にハンドリングしてください。

参照
Send, SendToAll
Result nn::pia::transport::ReliableProtocol::Send ( StationId  destinationStationId,
const void *  pData,
uint32_t  dataSize 
)

データを送信します。

この関数でセットされた送信データは、パケットに対して適切なサイズに分割され内部のバッファに保持されます。 その後の common::Scheduler::Dispatch() の中で順次パケットが作成され送信されていきます。 送信してからしばらくたっても到達が確認できないデータは再送されます。 再送までの時間は RTT に応じて自動的に調整されます。 到達が確認できたデータはバッファから削除され、バッファはその後のデータ送信のために使う事ができるようになります。

引数
[in]destinationStationId送信先の StationId です。
[in]pData送信するデータのアドレスです。
[in]dataSize送信するデータのサイズ(バイト)です。
戻り値
成功すれば、 IsSuccess() が true を返す Result が返されます。
返るエラーの一覧:

ResultInvalidState ReliableProtocol が初期化されていないか、session のセットアップが完了していない可能性があります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。

ResultInvalidArgument 引数が誤っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。

ResultNotInCommunication 指定された送信先と通信中ではありません。自分か指定した相手がセッション内に存在しません。アプリケーションで適切にハンドリングしてください。

ResultBufferIsFull 送信バッファに空きがありません。頻発する場合は、 Initialize() で指定する送信バッファのデータ数を増やすことを検討してください。アプリケーションで適切にハンドリングしてください。

ResultTemporaryUnavailable セッション移行処理中のため、一時的に API を利用できない状態です。ジョイントセッション機能使用時にのみ返ります。アプリケーションで適切にハンドリングしてください。

ResultNotFound 指定された送信先が見つかりません。アプリケーションで適切にハンドリングしてください。

参照
Receive, SendToAll
Result nn::pia::transport::ReliableProtocol::SendToAll ( const void *  pData,
uint32_t  dataSize 
)

データを全ステーションに向けて送信します。

この関数でセットされた送信データは、パケットに対して適切なサイズに分割され内部のバッファに保持されます。 その後の common::Scheduler::Dispatch() の中で順次パケットが作成され送信されていきます。 送信してからしばらくたっても到達が確認できないデータは再送されます。 再送までの時間は RTT に応じて自動的に調整されます。 到達が確認できたデータはバッファから削除され、バッファはその後のデータ送信のために使う事ができるようになります。

引数
[in]pData送信するデータのアドレスです。
[in]dataSize送信するデータのサイズ(バイト)です。
戻り値
成功すれば、 IsSuccess() が true を返す Result が返されます。
返るエラーの一覧:

ResultInvalidState ReliableProtocol が初期化されていないか、session のセットアップが完了していない可能性があります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。

ResultInvalidArgument 引数が誤っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。

ResultNotInCommunication 通信中ではありません。アプリケーションで適切にハンドリングしてください。

ResultBufferIsFull 送信バッファに空きがありません。頻発する場合は、 Initialize() で指定する送信バッファのデータ数を増やすことを検討してください。アプリケーションで適切にハンドリングしてください。

参照
Receive, Send
void nn::pia::transport::ReliableProtocol::SetThroughputLimit ( uint32_t  throughputLimit)

common::Scheduler::Dispatch の 1 回の呼び出しあたりにこのプロトコルが送信するデータ量の上限を指定します。

このプロトコルが common::Scheduler::Dispatch の 1 回あたりに送信するデータ量の平均値が この関数で設定した値以下になるように制限されます。 瞬間的にはここで設定した値以上のサイズの送信が行われることもあります。

設定できる値の最大値は ThroughputLimitMax です。これより大きな値を設定した場合は、ThroughputLimitMax を設定したものと扱います。 この API を呼び出さなかった場合のデフォルト値は ThroughputLimitMax です。

引数
[in]throughputLimit設定する送信データ量の上限サイズ(バイト)です。
virtual void nn::pia::transport::ReliableProtocol::Trace ( uint64_t  flag) const
virtual

デバッグに有用な情報をプリントします。

引数
[in]flagトレースフラグの論理和。詳細は TraceFlag 型を参照してください。

nn::pia::transport::Protocolを再定義しています。