PGM センダとレシーバ
PGM セッションの確立は、TCP セッションに関連付けられている接続確立ルーチンと似ています。 ただし、TCP セッションからの大幅な逸脱は、クライアントとサーバーのセマンティクスが逆になるということです。サーバー (PGM 送信側) はマルチキャスト・グループに接続し、クライアント (PGM 受信側) は接続の受け入れを待機します。 以下の段落では、PGM 送信側と PGM レシーバーを作成するために必要なプログラム・ステップについて詳しく説明します。 このページでは、PGM セッションで使用可能なデータ・モードについても説明します。
PGM 送信側
PGM 送信側を作成するには、次の手順を実行します。
クライアントとの正式なセッション ハンドシェイクは実行されません。 接続プロセスは、エンドポイント アドレス (マルチキャスト グループ) をソケットに関連付けるという点で、UDP 接続に似ています。 完了すると、ソケットでデータが送信される場合があります。
送信側が PGM ソケットを作成してマルチキャスト・アドレスに接続すると、PGM セッションが作成されます。 信頼できるマルチキャスト セッションは、グローバル一意識別子 (GUID) とソース ポートの組み合わせによって定義されます。 GUID はトランスポートによって生成されます。 sSource ポートはトランスポートによって指定され、どのソース ポートを使用するかを制御するコントロールは提供されません。
注意
送信側ソケットでのデータの受信は許可されず、エラーが発生します。
次のコード スニペットは、PGM 送信側の設定を示しています。
SOCKET s;
SOCKADDR_IN salocal, sasession;
int dwSessionPort;
s = socket (AF_INET, SOCK_RDM, IPPROTO_RM);
salocal.sin_family = AF_INET;
salocal.sin_port = htons (0); // Port is ignored here
salocal.sin_addr.s_addr = htonl (INADDR_ANY);
bind (s, (SOCKADDR *)&salocal, sizeof(salocal));
//
// Set all relevant sender socket options here
//
//
// Now, connect <entity type="hellip"/>
// Setting the connection port (dwSessionPort) has relevance, and
// can be used to multiplex multiple sessions to the same
// multicast group address over different ports
//
dwSessionPort = 0;
sasession.sin_family = AF_INET;
sasession.sin_port = htons (dwSessionPort);
sasession.sin_addr.s_addr = inet_addr ("234.5.6.7");
connect (s, (SOCKADDR *)&sasession, sizeof(sasession));
//
// We're now ready to send data!
//
PGM レシーバー
PGM レシーバーを作成するには、次の手順を実行します。
- PGM ソケットを作成します。
- は 、送信側が送信するマルチキャスト グループ アドレスにソケットをバインドします。
- ソケットで listen 関数を呼び出して、ソケットをリッスン モードにします。 listen 関数は、指定されたマルチキャスト・グループ・アドレスおよびポートで PGM セッションが検出されると 戻ります。
- accept 関数を呼び出して、セッションに対応する新しいソケット ハンドルを取得します。
新しいセッションの受け入れをトリガーするのは、元の PGM データ (ODATA) のみです。 そのため、他の PGM トラフィック (SPM や RDATA パケットなど) はトランスポートによって受信される可能性がありますが、 listen 関数は返されません。
セッションが受け入れられると、返されたソケット ハンドルがデータの受信に使用されます。
注意
受信ソケットでのデータの送信は許可されず、エラーが発生します。
次のコード スニペットは、PGM レシーバーの設定を示しています。
SOCKET s,
sclient;
SOCKADDR_IN salocal,
sasession;
int sasessionsz, dwSessionPort;
s = socket (AF_INET, SOCK_RDM, IPPROTO_RM);
//
// The bind port (dwSessionPort) specified should match that
// which the sender specified in the connect call
//
dwSessionPort = 0;
salocal.sin_family = AF_INET;
salocal.sin_port = htons (dwSessionPort);
salocal.sin_addr.s_addr = inet_addr ("234.5.6.7");
bind (s, (SOCKADDR *)&salocal, sizeof(salocal));
//
// Set all relevant receiver socket options here
//
listen (s, 10);
sasessionsz = sizeof(sasession);
sclient = accept (s, (SOCKADDR *)&sasession, &sasessionsz);
//
// accept will return the client socket and we are now ready
// to receive data on the new socket!
//
データ モード
PGM セッションには、メッセージ・モードとストリーム・モードの 2 つのオプションがあります。
メッセージ モードは、個別のメッセージを送信する必要があり、ソケットの種類のSOCK_RDMで指定されるアプリケーションに適しています。 ストリーム モードは、ビデオアプリケーションや音声アプリケーションなどの受信側にストリーミング データを送信する必要があり、ソケットの種類のSOCK_STREAMで指定されるアプリケーションに適しています。 モードの選択は、Winsock がデータを処理する方法に影響します。
次の例を考えてみましょう。メッセージ・モード PGM 送信側は、それぞれ 100 バイトのバッファーを持つ WSASend 関数を 3 回呼び出します。 この操作は、3 つの個別の PGM パケットとしてネットワーク上に表示されます。 受信側では、より大きな受信バッファーが指定されている場合でも、 WSARecv 関数の各呼び出しは 100 バイトのみを返します。 これに対し、ストリーム モードの PGM 送信側では、これらの 3 つの 100 バイト伝送を、ワイヤ上の 3 つ未満の物理パケットに結合できます (または、受信側のデータの 1 つの BLOB に結合されます)。 そのため、受信側がいずれかの Windows ソケット受信機能を呼び出すと、PGM トランスポートによって受信された任意の量のデータが、データの物理的な送受信方法に関係なくアプリケーションに返されることがあります。