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 通訊端。
- 將通訊端系結 至傳送者正在傳輸的多播群組位址。
- 在通訊端上呼叫 接聽 函式,將通訊端置於接聽模式中。 在指定的多播群組位址和埠上偵測到 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 傳輸所接收的任何資料量都可以傳回至應用程式,而不論資料實際傳輸或接收的方式為何。