P2Pで接続する先に、各クライアントのグローバルIPを予め取得しておき、P2P接続時にP2PクラスのConnectを呼び出す。接続が成功すると、OnP2PReady()のコールバックが呼び出され、接続できないとタイムアウトととなり、OnP2PFail()のコールバックが呼び出されるようになる。
// P2Pクラスのインスタンス作成
std::shared_ptr<IDiarkisP2P> p2p = std::shared_ptr<IDiarkisP2P>(DiarkisCreateP2P(this->udp));
// ロガーをセット
p2p->SetLoggerFactory(this->loggerFactory);
// 各種コールバックイベントをセットする
REG_EVENT(p2p->GetReadyEvent(), [this](void*, const DiarkisReadyEventArgs& args) { this->OnP2PReady(args); });
REG_EVENT(p2p->GetFailEvent(), [this](void*, const DiarkisFailEventArgs& args) { this->OnP2PFail(args); });
REG_EVENT(p2p->GetMessageEvent(), [this](void*, const DiarkisMessageEventArgs& args) { this->OnP2PMessage(args); });
REG_EVENT(p2p->GetExceptionEvent(), [this](void*, const DiarkisExceptionEventArgs& args) { this->OnP2PException(args); });
// 各クライアントとP2Pで接続
p2p->Connect(urlStr, port);
P2Pに接続した後は、以下のようにメッセージを送信し合う。
// 接続クラアント分だけ送信
for (auto p2p = p2pList.begin(); p2p != p2pList.end(); p2p++)
{
if ((*p2p)->IsConnected())
{
(*p2p)->Send(payload);
}
}
データ送信で受けた側は、以下のコールバックが呼び出される。各クライアントから送られたPayloadデータを受けとることができる。
void DiarkisP2PBase::OnP2PMessage(const DiarkisMessageEventArgs& args)
{
// 受け取ったPayloadデータ
const vector<uint8_t>& payload = args.GetPayload();
FString strUnresolved = args.GetUnresolvedAddress().c_str();
FString strResolved = args.GetResolvedAddress().c_str();
FString msg = *FString::Format(
TEXT("P2P payload received from a peer client ({0}) {1} payload size= {2}\n payload= {3}"),
{ *strUnresolved, *strResolved, (uint32)payload.size(), *dataString }
);
this->fileAndDebugLoggerBackend->Log(TCHAR_TO_UTF8(*msg));
}