次の方法で共有


TCP/IP アドレス オブジェクトの作成

TCP/IP アドレス オブジェクトの作成

ここでは、IDirectPlay8Address メソッドを使って、Transmission Control Protocol/Internet Protocol (TCP/IP) サービス プロバイダ用の典型的なアドレス オブジェクトを作成する方法について説明する。

アドレス オブジェクトを作成するための最初の手順は、CoCreateInstance を呼び出して IDirectPlay8Address オブジェクトを作成することである。このパラメータには、アドレス オブジェクトのクラス識別子 (CLSID_DirectPlay8Address)、インターフェイスの識別子 (IID_IDirectPlay8Address)、IDirectPlay8Address インターフェイスへのポインタのアドレスが含まれる。次のサンプル コードは、アドレス オブジェクトを作成する方法を示している。

IDirectPlay8Address*  g_pDeviceAddress;
.
.
.
hr = CoCreateInstance( CLSID_DirectPlay8Address, NULL,  
                       CLSCTX_INPROC_SERVER,
                       IID_IDirectPlay8Address,
                       (LPVOID*) &g_pDeviceAddress );

CoCreateInstance の使い方については、「COM オブジェクトの作成」を参照すること。

アドレス オブジェクトの作成後は、少なくともサービス プロバイダのコンポーネントを設定する必要がある。そのためには、IDirectPlay8Address::SetSP を呼び出す。次のサンプル コードは、サービス プロバイダに Microsoft® DirectPlay®  TCP/IP プロトコル サービス プロバイダを設定する方法を示している。

hr = g_pDeviceAddress->SetSP(&CLSID_DP8SP_TCPIP );

EnumHostsConnectHost の各メソッドには、OKTOQUERYFORADDRESSING フラグ (DPNENUMHOSTS_OKTOQUERYFORADDRESSING、 DPNCONNECT_OKTOQUERYFORADDRESSING、 DPNHOST_OKTOQUERYFORADDRESSING) があり、このフラグによって DirectPlay はサービス プロバイダ コンポーネントを超えるアドレスで不足している情報をユーザーに求めることができる。しかし、ほとんどのアプリケーションでは、ユーザーの使い勝手を向上させるために、これら標準のダイアログをオーバーライドすることが予想される。以下では、TCP/IP プロトコル サービス プロバイダに使う共通のコンポーネントと必要なコンポーネントを示す。

デバイス アドレス

ローカル プレーヤのデバイス アドレスを作成し、TCP/IP protocol をサービス プロバイダとして使う場合は、デバイス ポートの設定も必要になることが考えられる。設定できるその他のデータの一覧については、「データ値の概要」を参照すること。

次のサンプル コードは、IDirectPlay8Address::AddComponent メソッドを使って、デバイス アドレスのポートを設定する方法を示している。

DWORD dwPort;
// Set dwPort to the port number for the device address.

hr = g_pDeviceAddress->AddComponent( DPNA_KEY_PORT,           //pwszName
                                   &dwPort, sizeof(dwPort),   //lpvData, dwDataSize
                                   DPNA_DATATYPE_DWORD );     //dwDataType

セッションのホストとなるプレーヤ用にポートを設定する場合は、DPN_APPLICATION_DESC 構造体に DPNSESSION_NODPNSVR フラグを設定し、Host メソッドに渡すことを推奨する。しかし、DPNSVR を無効にする場合は、次のいずれかの操作を実行する必要がある。

  • EnumHosts を呼び出すときに、pdpaddrHost パラメータにホストのポートを指定する。
  • Connect を呼び出すときに、pHostAddr パラメータにホストのポートを指定する。

ホスト アドレス

ホスト アドレスを作成し、サービス プロバイダとして TCP/IP プロトコル を使う場合は、ホスト名のアドレス コンポーネントの設定が必要になることもある。設定できるその他のデータの一覧については、「データ値の概要」を参照すること。セッションの検索に EnumHosts を使わなかった場合で、Connect に DPNCONNECT_OKTOQUERYFORADDRESSING フラグを渡さないときは、ホスト アドレスに対してホスト名を指定する必要がある。

次のサンプル コードは、IDirectPlay8Address::AddComponent メソッドを使って、ホスト アドレス用のホスト名を設定する方法を示している。

size_t cb;
WCHAR wstrIP[MAX_PATH];
// Set wstrIP to the host IP address
hr = StringCbLengthW(wstrIP, MAX_PATH, &cb);

hr = g_pHostAddress->AddComponent(DPNA_KEY_HOSTNAME,        //pwszName
                                  wstrIP,                   //lpvData
                                  cb,                       //dwDataSize in bytes
                                  DPNA_DATATYPE_STRING );   //dwDataType

この例では、wstrIP にセッション ホストのインターネット プロトコル (IP) アドレスまたは名前がドット形式表記で含まれる。 たとえば、文字列 "123.123.123.123" や "DirectPlayMaze.rte.microsoft.com"のような形式となる。

同様に、ホスト アドレスに対してポートの設定が必要なこともある。Host を呼び出すプレーヤのデバイス アドレスのポート コンポーネントを設定する場合は、EnumHosts または Connect に渡されるホスト アドレスのポート コンポーネントを設定することを推奨する。セッションのホスト アドレスの検索に EnumHosts を使わなかった場合で、DPNCONNECT_OKTOQUERYFORADDRESSING フラグを渡さないときは、セッションに接続するためにはホスト アドレスに対してポートを指定する必要がある。

次のサンプル コードは、IDirectPlay8Address::AddComponent メソッドを使って、ホスト アドレスのポートを設定する方法を示している。

DWORD dwPort;
//Set dwPort to the port number of the host address

hr = g_pHostAddress->AddComponent( DPNA_KEY_PORT,           //pwszName
                                 &dwPort, sizeof(dwPort),   //lpvData, dwDataSize
                                 DPNA_DATATYPE_DWORD );     //dwDataType

アドレス オブジェクトの作成後は、Connect メソッドの pDeviceInfo パラメータにデバイス パラメータを渡し、pHostAddr パラメータにホスト アドレスを渡して、セッションに接続する。