P2Pで接続して、メッセージをやり取りする方法

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));

}