13

免責事項私はここですべての同様のトピックを注意深く読み、グーグル検索を行いました。いずれも私の質問に答えてくれなかったので、このトピックに情報を蓄積したいと思います。PS英語が苦手かもしれませんが、ごめんなさい。

p2pアプリケーション(ゲーム)を作りたいです。明らかに、多くの人が1つのインターネットアクセスポイント(ルーター)を備えたローカルネットワークの一部であるマシンでこのプログラムを実行し、アプリはポートフォワーディングなしでは機能しません。そこで、調査を行ったところ、UPnPを使用して自動ポート転送を実行できることがわかりました。マイクロテストコードは、ポートフォワーディングにアクセスするために作成されました。

bool CPortController::Init() {


  HRESULT result = CoInitialize(NULL); // Must be NULL
  if (FAILED(result)) return false;

  result = CoCreateInstance(__uuidof(UPnPNAT), NULL, CLSCTX_ALL, __uuidof(IUPnPNAT), (void **)&Nat);
  if (FAILED(result) || !Nat) return false;

  result = Nat->get_StaticPortMappingCollection(&Collection); 
  if (FAILED(result) || !Collection) return false; // Here I'm getting S_OK as result, but Collection is always == 0

  return true;
}

私が見つけたその理由(コードのコメントを参照)を検索しました:1。古いシステム(いいえ、更新されたWin7があります)2。ルーターにUPnP機能がないか、有効になっていない可能性があります3.ファイアウォールがブロックされている可能性がありますどちらもUPnPに必要なTCPポート2869またはUDPポート1900

残念ながら、最後の2つをチェックするためのルーターにアクセスできませんが、SkypeとuTorrent(両方ともp2p)が完全に機能するため、それほど重要ではありません。ユーザーに何もするように依頼することなく、アプリで同じトリックを実行してポートを自動的に転送する方法を見つける必要があります。

UPnPライブラリについて: UPnPライブラリ(PlatinumUPnP、miniUPnP)はほとんど見つかりませんでしたが、スマートデバイスを見つけてまとめることを目的としたコードがたくさんあるようです...うーん...これが必要かどうかはわかりませんタスクを完了すると、自動ポート転送用のコード(上記のWinUPnPAPIを使用していない)が見つかりません。

私は今少し迷っています。誰かが私に研究を続ける方向を教えてもらえますか?多分それのためにUPnP以外の何かがありますか?多分使用するlib(私が逃した)がありますか?光を広げてください。前もって感謝します。

4

1 に答える 1

16

UPnP 開発者ツールからDeviceSpyを実行し、ネットワークで を検索します。何もない場合、ルーターは UPnP に対応していないか、無効になっています。ある場合は、サービスを確認してください。InternetGatewayDevice v2 (2010 年以降) の時点で、UPnP 経由で静的ポート マッピング (リース時間 0) を設定することは許可されていないことに注意してください。InternetGatewayDeviceWANIPConnection

@Rook が指摘したように、P2P 接続を確立する方法は他にもあるため、他のランダムな P2P ソフトウェアが動作するという事実は、ソフトウェアがポート マッピングの構成方法を知っていることを必ずしも意味しません。特にSkypeは実際にはP2Pではなく、膨大な数の専用スーパーノードに依存しています.

于 2012-11-14T22:35:19.037 に答える