文章編號: 131978 - 上次校閱: 2007年2月22日 - 版次: 3.3

如何接收/傳送多點傳送 WinNT/Win95 使用 WinSock 之下

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將告訴您,如何主機可以成為多點傳送群組的成員,並接收與傳送多點傳送封包與 Windows NT 使用 Windows 通訊端 (WinSock) 介面。

這項功能也是可用的 Windows 95 的。

其他相關資訊

傳送 IP 多點傳送的資料包

目前只能在型別 SOCK_DGRAM AF_INET 通訊端上支援 IP 多點傳送。

若要傳送多點傳送的資料包指定的 IP 多點傳送的位址 (範圍是 224.0.0.0 到 239.255.255.255 作為目的地地址,一個 sendto() 中呼叫。

預設 IP 多點傳送的資料包與一個存留時間 (TTL) 傳送的防止轉送超過單一子網路的 1。下列程式碼會示範如何變更這項功能:

  int ttl = 7 ; // Arbitrary TTL value.

  setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl))
				
多點傳送的資料包以 0 的 TTL 不傳輸上任何子網路。 以大於其中一個可能會將傳遞至一個以上的子網路如果有附加至第一個躍點的子網路的一或多個多點傳送的路由器的 TTL 的多點傳送的資料包。

多點傳送的路由器不會轉寄 224.0.0.0 到 224.0.0.255 內含不論他們 TTLs 之間的目的地位址的多點傳送的資料包。此特定範圍的位址被保留給路由通訊協定和其他低階的拓樸探索或維護通訊協定,例如閘道探索和群組成員資格報告的使用。 從單一網路介面傳送每個多點傳送的傳輸,即使主應用程式擁有一個以上的多點傳播能夠介面。通訊端選項都可以使用覆寫預設值為從指定的通訊端的後續傳輸。例如
  unsigned long addr = inet_addr("157.57.8.1");
  setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF,

            (char *)&addr, sizeof(addr))
				
addr"是本機 IP 位址所要的輸出介面的地方。 位址是 INADDR_ANY 可能用來還原成預設介面。 請注意這個位址可能會與一個通訊端繫結至不同。

如果多點傳送的資料包傳送至傳送端主機本身外寄的介面), 所屬的群組依預設,資料包的複本已迴圈回由本機傳遞在 IP 層。在某些版本 UNIX 下沒有停用這種行為 (IP_MULTICAST_LOOP) 可用的選項。在 Windows NT 中不支援此選項。如果嘗試停用這種行為呼叫就會失敗並錯誤 WSAENOPROTOOPT (不正確的通訊協定選項)。

與初始的 TTL 傳送大於 1 可能傳遞給在不同的介面,從傳送端主機在其上它已傳送,如果主應用程式屬於目的地群組上的其他介面的多點傳送的資料包。回送控制項選項並不會影響這類傳遞。

接收 IP 多點傳送的資料包

主應用程式可以接收 IP 前多點傳送的資料包它必須成為成員的一或多個 IP 多點傳送的群組。處理程序可以要求主應用程式藉由使用下列通訊端聯結多點傳送的群組選項
   struct ip_mreq mreq;
				
其中 mreq 」 是下列結構:
   struct ip_mreq {


       struct in_addr imr_multiaddr;   /* multicast group to join */ 
       struct in_addr imr_interface;   /* interface to join on    */ 


   }
				
例如:
        #define RECV_IP_ADDR   "225.6.7.8"  // arbitrary multicast address

        mreq.imr_multiaddr.s_addr = inet_addr(RECV_IP_ADDR);
        mreq.imr_interface.s_addr = INADDR_ANY;
        err = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                        (char*)&mreq, sizeof(mreq))
				
請注意有必要將繫結至的地址之前呼叫 setsockopt() 函式。

每個成員資格是單一的介面相關聯,而且可以加入一個以上的介面上相同的群組。imr_interface 」 位址應該是 INADDR_ANY 選擇預設多點傳送的介面或其中一個主機的本機地址,以選擇特定的 (多點傳送功能) 介面。

成員資格的最大數目只受到記憶體和網路卡支援。

下列程式碼範例可以用來卸除一個成員資格
   struct ip_mreq mreq;
   setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,


             (char*)&mreq,sizeof(mreq))
				
mreq"其中包含為相同的值用來加入成員資格。當通訊端關閉或殺害持有通訊端處理序,也會卸除通訊端相關聯之成員資格。然而,多個通訊端可能會主張中特定群組的成員資格和主應用程式會保持該群組的成員,到最後一個宣告卸除為止。

通訊端相關聯之成員資格不會一定是決定該通訊端接收的資料包。傳入多點傳送封包接收的核心 IP 層級 (如果任何通訊端已經宣告資料包的目的群組中的成員資格 ; 不過,多點傳送資料包傳遞至特定的通訊端根據目的地連接埠 (或原始通訊端的通訊協定] 類型),就像對單點傳送資料包一樣。若要接收多點傳送的資料包傳送到特定的連接埠,就必須將繫結至離開未指定本機的位址 (也就是 INADDR_ANY) 該本機連接埠。

一個以上的處理程序 bind() 呼叫的前面是下列程式碼] 選項可能會連結到相同的 SOCK_DGRAM UDP 連接埠:
   int one = 1;
   setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one))
				
在這種情況下每個傳入多點傳播或廣播 UDP 資料包傳送目的地為共用的連接埠會傳遞至所有的通訊端繫結至連接埠。

定義所需的新、 多點傳送相關的通訊端選項都位於 WINSOCK.H 檔案中。所有的 IP 位址會以網路位元組順序傳遞。

?考

檔案 DOC\MISC\MULTICAST.TXT 是隨附在 Win32 SDK。

這篇文章中的資訊適用於:
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Win32 Software Development Kit (SDK) 3.5
  • Microsoft Win32 Software Development Kit (SDK) 3.51
  • Microsoft Windows 95
關鍵字:?
kbmt kbapi kbcode kbhowto kbnetwork kbwinsock KB131978 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:131978? (http://support.microsoft.com/kb/131978/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。