Platform SDK: DirectX

IDirectPlay4::Send

IDirectPlay4::Send メソッドは、メッセージをセッション内の別のプレーヤー、プレーヤーのグループ、またはすべてのプレーヤーに送信する。メッセージを別のプレーヤーに送信するには、その対象となるプレーヤーのプレーヤー ID を指定する。メッセージをプレーヤーのグループに送信するには、メッセージをグループに割り当てられたグループ ID に送信する。メッセージをセッション全体に送信するには、メッセージをプレーヤー ID の DPID_ALLPLAYERS に送信する。メッセージは、メッセージごとに保証付きプロトコルまたは保証なしプロトコルのいずれを使用しても送信できる。セッションが保証サーバーにある場合、メッセージはメッセージごとに暗号化して (プライバシーを保護するため)、またはデジタル署名をして (認証を行うため) 送信できる。

HRESULT Send(
  DPID idFrom,
  DPID idTo,
  DWORD dwFlags,
  LPVOID lpData,
  DWORD dwDataSize
);

パラメータ

idFrom
送信側プレーヤーの ID。プレーヤー ID は、このコンピュータのローカル プレーヤーのいずかに対応していなければならない。
idTo
メッセージの送信先 ID。メッセージを別のプレーヤーに送信するには、プレーヤーの ID を指定する。メッセージをグループ内のすべてのプレーヤーに送信するには、グループの ID を指定する。メッセージをセッション内のすべてのプレーヤーに送信するには、定数記号の DPID_ALLPLAYERS を使用する。メッセージをサーバー プレーヤーに送信するには、定数記号の DPID_SERVERPLAYER を指定する。プレーヤーは、それ自体にメッセージを送信することはできない。
dwFlags
メッセージの送信方法を指定する。デフォルト (dwFlags = 0) では、メッセージは保証なしで送信される。
DPSEND_ENCRYPTED
メッセージを暗号化して送信する。これは、セキュア セッションでのみ行われる。このフラグは、DPSEND_GUARANTEED フラグも設定されている場合にのみ使用できる。メッセージは、DPMSG_SECUREMESSAGE システム メッセージとして送信される。
DPSEND_GUARANTEED
保証付き配信方式を使用してメッセージを送信する。
DPSEND_SIGNED
デジタル署名を使用してメッセージを送信する。これは、セキュア セッションでのみ行うことができる。このフラグは、DPSEND_GUARANTEED フラグも設定されている場合にのみ使用できる。メッセージは、DPMSG_SECUREMESSAGE システム メッセージとして送信される。
lpData
送信するデータへのポインタ。
dwDataSize
送信するデータの長さ。

戻り値

成功すれば DP_OK、失敗すれば次のエラー値のいずれかを返す。

DPERR_BUSY
DPERR_CONNECTIONLOST
DPERR_INVALIDPARAMS
DPERR_INVALIDPLAYER
DPERR_NOTLOGGEDIN
DPERR_SENDTOOBIG

保証付き配信方式を使用するように指定されていないメッセージに暗号化フラグや署名フラグが指定された場合は、DPERR_INVALIDPARAMS を返す。クライアント アプリケーションが最初にログオンしないで機密保護メッセージを送信しようとした場合は、DPERR_NOTLOGGEDIN を返す。

メッセージをグループに送信した場合、戻り値の DP_OK が、グループ内のすべてのプレーヤーがメッセージを受信したことを示すとは限らない。メッセージを保証付きで送信した場合、DP_OK は DirectPlay がメッセージをグループ内のすべてのプレーヤーに送信するように最善を尽くしたことを意味している。一般に、メッセージを受信していないプレーヤーは、その接続に問題があって削除されている。

注意

非同期送信オプションでは、IDirectPlay4::SendEx を使用すること。

メッセージは、保証付き、または保証なしで送信できる。デフォルトでは、メッセージは保証なしで送信される。つまり、DirectPlay は、メッセージが目的の受信者に届いているかどうかを検証しない。保証付きメッセージを送信すると、時間がかかる。少なくとも、保証なしメッセージの2〜3倍の時間がかかる。アプリケーションは、できる限り保証付きメッセージの送信を少なくし、また喪失メッセージに耐えられるように設計する必要がある。DirectPlay に搭載されているサービス プロバイダはすべて、データを破損から守るために整合性チェックを行っている。このメソッドを使用して送信されたメッセージは、破損していないと保証される。

サービス プロバイダが保証付きメッセージをサポートしているかどうかに関係なく、また DirectPlay プロトコル フラグを設定しているかどうかに関係なく、システム メッセージは常に保証付きで送信される。保証付きシステム メッセージを送信するときは、DirectPlay プロトコルが自動的に使用される。

システム メッセージ以外で、アプリケーションが DirectPlay プロトコル フラグを設定して、メッセージを保証付きで送信した (DPSEND_GUARANTEED フラグを設定する) 場合、サービス プロバイダが保証付きメッセージをサポートしているかどうかに関係なく、そのメッセージは保証付きで送信される。

システム メッセージ以外で、アプリケーションが DirectPlay プロトコル フラグを設定しないで、メッセージを保証付きで送信した場合、そのメッセージは、サービス プロバイダが保証付きメッセージをサポートしているときのみ保証付きで送信される。サービス プロバイダがそれをサポートしていない場合、DPSEND_GUARANTEED フラグに関係なく、メッセージは保証付きで送信されない。

アプリケーションは、セッション作成時に DPSESSION_DIRECTPLAYPROTOCOL フラグを設定して DirectPlay プロトコルを起動する。

プレーヤーは、自分自身にメッセージを送信することはできない。プレーヤーが、DPID_ALLPLAYERS に含まれるグループや DPID_ALLPLAYERS にメッセージを送信した場合、プレーヤーにはそのメッセージのコピーが送信されない。ただし、セッション記述 (DPSESSIONDESC2) に DPSESSION_NOMESSAGEID が指定されている場合は例外である。この場合、プレーヤーはグループに送信したメッセージを受信できる。このメッセージには DirectPlay メッセージ ID ヘッダー (メッセージの送信者を示す) がないので、メッセージ ID に基づいてメッセージがフィルタリングされない。

DPSESSION_NOMESSAGEID を使用している場合、idFrom パラメータは意味がなくなり、また idTo パラメータは正しいターゲット コンピュータにメッセージを方向付けるためだけに使用される。ターゲット コンピュータに複数のプレーヤーがある場合は、メッセージを設定する受信キューを特定できない。メッセージは、受信されても DPID_UNKNOWN プレーヤーから送信されたものと表示される。

Send メソッドを使用して転送可能なメッセージのサイズには制限がない。DirectPlay は、サイズの大きなメッセージを自動的にいくつかのパケットに分割し、受信側でそれらを組み立てる。サイズの大きなメッセージを保証なしで送信する場合は、そのパケットのうち 1 つでも受信側に到達しなければ、メッセージ全体が無視される。アプリケーションは、GetCaps を呼び出して DPCAPS 構造体の dwMaxBufferSize メンバを調べることにより、1 つのパケットで送信可能なメッセージの最大サイズを判定できる。

暗号化メッセージや署名付きメッセージを送信した場合、そのメッセージはアプリケーション メッセージではなく、システム メッセージの DPMSG_SECUREMESSAGE として配布される。

必要条件

  Windows NT/2000 : Windows 2000 が必要。
  Windows 95/98 : Windows 95 以降が必要。Windows 95 用に再配布可能な形で使用可能。
  ヘッダー : dplay.h で宣言。
  インポート ライブラリ : dplayx.lib を使用。

参照

IDirectPlay4::ReceiveIDirectPlay4::SendExIDirectPlay4::SendChatMessageDPMSG_SECUREMESSAGE