次の方法で共有


IDirectPlay8NATResolver インターフェイスの使い方

IDirectPlay8NATResolver インターフェイスの使い方

IDirectPlay8NATResolver インターフェイスは、DPNA_KEY_NAT_RESOLVER および DPNA_KEY_NAT_RESOLVER_USER_STRING アドレス コンポーネントと共に使うと、自動ネットワーク アドレス変換 (NAT) のサポートが向上する場合がある。ここでは、インターネットに配置する NAT リゾルバ アプリケーションの実装方法について説明する。ホストとクライアントはこのサーバーを使い、それぞれのパブリック アドレスを識別する。詳細については、「ピア ホストに関する NAT の高度な技術」、ピア クライアントに関する NAT の高度な技術」、および「サーバーに関する NAT の高度な技術」で説明している。

IDirectPlay8NATResolver インターフェイスの作成

NAT リゾルバを準備するには、最初にインターフェイス オブジェクトを作成し、IDirectPlay8NATResolver::Initialize を呼び出してコールバック関数を指定する。次に例に示す。

hr = CoCreateInstance(CLSID_DirectPlay8NATResolver,
                      NULL, 
                      CLSCTX_INPROC_SERVER,
                      IID_IDirectPlay8NATResolver, 
                      (LPVOID*) &g_pDPNATResolver);

.
.
.
hr = g_pDPNATResolver->Initialize(NULL, DirectPlayMessageHandler, 0);

IDirectPlay8ThreadPool インターフェイスを使うと、IDirectPlay8NATResolver インターフェイスのスレッド処理を制御できる。IDirectPlay8ThreadPool を使う場合は、最初にこのインターフェイスを初期化し、設定すること。

NAT リゾルバの開始

IDirectPlay8NATResolver インターフェイスを初期化したら、IDirectPlay8NATResolver::Start を呼び出し、NAT リゾルバの問い合わせの聴取を開始する。IDirectPlay8NATResolver::Start に渡すデバイス アドレスは、IDirectPlay8Peer::Host または IDirectPlay8Server::Host に渡すアドレスに似ているが、伝送制御プロトコル/インターネット プロトコル (TCP/IP) サービス プロバイダのアドレスにする必要があり、IPv6 デバイスのグローバル一意識別子 (GUID) は受け付けない。デバイス GUID は指定しないでおくと、すべてのデバイスを使って聴取できる。また、アドレス オブジェクトを指定しないこともできる。その場合、Microsoft® DirectPlay® はすべての TCP/IP プロトコル デバイスで聴取するポートを選択する。次の例は、ユーザーが指定した特定のポートで任意に聴取を選択する方法を示している。

if (g_dwPort > 0)
{
    hr = pDP8AddrLocal->AddComponent(DPNA_KEY_PORT, 
                                     &g_dwPort, 
                                     sizeof(DWORD),
                                     DPNA_DATATYPE_DWORD);
}
hr = g_pDPNATResolver->Start(&pDP8AddrLocal, 1, 0);

問い合わせの処理

IDirectPlay8NATResolver インターフェイスは、アプリケーションのメッセージ ハンドラに 1 つのコールバック DPN_MSGID_NAT_RESOLVER_QUERY しか生成しない。メッセージには、問い合わせの送信元のアドレスおよび受信したデバイスが含まれる。アプリケーションでは、メッセージ ハンドラから DPN_OK を返して問い合わせに応答したり、失敗を示すコードを返して問い合わせを無視できる。次に例に示す。

case DPN_MSGID_NAT_RESOLVER_QUERY:
{
    DPNMSG_NAT_RESOLVER_QUERY *pMsgNATResolverQuery = (DPNMSG_NAT_RESOLVER_QUERY*) pMsgBuffer;
    .
    .
    .

    if (bIgnoreQuery)
    {
        // Return failure to ignore the query.
        return DPNERR_GENERIC;
    }
        // Return OK so that DirectPlay will reply.
    .
    .
    .
}

DPNMSG_NAT_RESOLVER_QUERY 構造体は、ユーザー文字列へのポインタも格納している。文字列が指定されていない場合は、NULL を格納する。この文字列は、IDirectPlay8Peer::HostIDirectPlay8Peer::EnumHostsIDirectPlay8Peer::ConnectIDirectPlay8Server::HostIDirectPlay8Client::EnumHosts、または IDirectPlay8Client::Connect に指定された問い合わせ元アプリケーションのデバイス アドレスに格納されている DPNA_NAT_RESOLVER_USER_STRING コンポーネントと等しい。ユーザー文字列はクリア テキストで送信されるため、重要なデータが含まれている場合、文字列を暗号化すること。

このインターフェイスの使い方の例については、「NATResolver」を参照すること。