共用方式為


PGM 傳送者和接收者

建立 PGM 會話類似于與 TCP 會話相關聯的連線建立常式。 不過,從 TCP 會話進行重大移轉是用戶端和伺服器語意已反轉;伺服器 (PGM 傳送者) 連線到多播群組,而用戶端 (PGM 接收者) 等候接受連線。 下列段落詳細說明建立 PGM 傳送者和 PGM 接收者所需的程式設計步驟。 此頁面也會描述 PGM 會話的可用資料模式。

PGM 寄件者

若要建立 PGM 寄件者,請執行下列步驟

  1. 建立 PGM 通訊端。
  2. 將通訊端系結 至INADDR_ANY。
  3. 連線 到多播群組傳輸位址。

沒有任何正式會話交握會與任何用戶端一起執行。 連線程式類似于 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 接收者,請執行下列步驟

  1. 建立 PGM 通訊端。
  2. 將通訊端系結 至傳送者正在傳輸的多播群組位址。
  3. 在通訊端上呼叫 接聽 函式,將通訊端置於接聽模式中。 在指定的多播群組位址和埠上偵測到 PGM 會話時,接聽函式會傳回。
  4. 呼叫 accept 函式以取得對應至會話的新通訊端控制碼。

只有原始 PGM 資料 (ODATA) 會觸發接受新的會話。 因此,傳輸可能會收到其他 PGM 流量 (,例如 SPM 或 RDATA 封包) ,但不會產生 接聽 函式傳回。

接受會話之後,傳回的通訊端控制碼會用於接收資料。

注意

不允許在接收通訊端上傳送資料,並產生錯誤。

 

下列程式碼片段說明如何設定 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 會話有兩種資料模式的選項:訊息模式和資料流程模式。

訊息模式適用于需要傳送離散訊息的應用程式,而且是由通訊端類型的SOCK_RDM所指定。 串流模式適用于需要將串流資料傳送給接收者的應用程式,例如視訊或語音應用程式,而且是由通訊端類型的SOCK_STREAM所指定。 選擇模式會影響 Winsock 處理資料的方式。

請考慮下列範例:訊息模式 PGM 傳送者會對 WSASend 函式進行三次呼叫,每個函式都有 100 位元組緩衝區。 此作業會在網路上顯示為三個離散 PGM 封包。 在接收端, WSARecv 函式的每個呼叫只會傳回 100 個位元組,即使提供較大的接收緩衝區也一樣。 相反地,透過串流模式 PGM 傳送者,這三個 100 個位元組傳輸可能會聯合成網路上少於三個實體封包, (或聯合成接收端) 的其中一個資料 Blob。 因此,當接收者呼叫其中一個 Windows Sockets 接收函式時,PGM 傳輸所接收的任何資料量都可以傳回至應用程式,而不論資料實際傳輸或接收的方式為何。