建立 PGM 工作階段類似於與 TCP 工作階段相關聯的連線建立例程。 不過,與 TCP 會話的重大差異在於客戶端和伺服器語意會反轉;伺服器 (PGM 傳送者) 會連線到多播群組,而用戶端 (PGM 接收者) 會等候接受連線。 下列段落詳細說明建立PGM傳送者和PGM接收者所需的程序設計步驟。 此頁面也會描述PGM會話的可用資料模式。
PGM 發件者
若要建立PGM傳送者,請執行下列步驟
- 建立 PGM 套接字。
- 套接字系結至INADDR_ANY。
- 將 連線到多播群組傳輸位址。
沒有任何正式會話交握會與任何用戶端一起執行。 連線程式類似於 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 套接字。
- 將套接字 系結至傳送者所傳送的多播群組位址。
- 呼叫套接字上的 接聽 函式,以將套接字置於接聽模式。 當在指定的多播群組位址和埠上偵測到PGM會話時,接聽函式會傳回。
- 呼叫 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 傳輸所接收的任何數據量都可以傳回至應用程式,而不論數據的實體傳輸或接收方式為何。