共用方式為


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 傳輸所接收的任何數據量都可以傳回至應用程式,而不論數據的實體傳輸或接收方式為何。