版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國]-局域網(wǎng)多播

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

概述

在現(xiàn)代公司、企業(yè)、教育機(jī)構(gòu)、政府部門等構(gòu)建的小型局域網(wǎng)絡(luò)應(yīng)用系統(tǒng)中,經(jīng)常要在一臺(tái)主機(jī)上把數(shù)據(jù)、消息、文件可靠地傳送到其他在線的計(jì)算機(jī)上,在更高級(jí)的應(yīng)用場合,還要在一臺(tái)主機(jī)上對(duì)其他的站點(diǎn)計(jì)算機(jī)進(jìn)行一對(duì)多的統(tǒng)一控制,比如開關(guān)機(jī),發(fā)布統(tǒng)一操作指令等。這種一對(duì)多的通信方式,一般在通信協(xié)議上采用無連接、無確認(rèn)的 UDP協(xié)議,在實(shí)現(xiàn)技術(shù)上可采用多播技術(shù)。共享式對(duì)等局域網(wǎng)由于各站資源取得機(jī)會(huì)具有均等的特性,采用 UDP 協(xié)議及多播技術(shù)具有應(yīng)用簡單,通信效率高的特點(diǎn),多播技術(shù)既可以進(jìn)行統(tǒng)一整體控制,也方便分組、分類進(jìn)行控制與管理1。

局域網(wǎng)多播技術(shù)實(shí)現(xiàn)簡介什么是多播“多播”也稱為“組播”,在分類集中控制、網(wǎng)上視頻會(huì)議、網(wǎng)上視頻點(diǎn)播特別適合采用多播方式。因?yàn)槿绻捎脝尾シ绞剑饌€(gè)節(jié)點(diǎn)傳輸,有多少個(gè)目標(biāo)節(jié)點(diǎn),就會(huì)有多少次傳送過程,這種方式雖然可靠,但效率極低,是不可取的;如果采用不區(qū)分目標(biāo)、全部發(fā)送的廣播方式,雖然一次可以傳送完數(shù)據(jù),但是顯然達(dá)不到區(qū)分特定數(shù)據(jù)接收對(duì)象的目的。采用多播方式,既可以實(shí)現(xiàn)一次傳送所有目標(biāo)節(jié)點(diǎn)的數(shù)據(jù),也可以達(dá)到只對(duì)特定對(duì)象傳送數(shù)據(jù)的目的1。

多播地址IP 采用 D 類地址來支持多播。每個(gè) D 類地址代表一組主機(jī)。共有 28 位可用來標(biāo)識(shí)小組。所以可以同時(shí)有多達(dá) 25億個(gè)小組。當(dāng)一個(gè)進(jìn)程向一個(gè) D 類地址發(fā)送分組時(shí),會(huì)盡最大努力將它送給小組的所有成員,但不能保證全部送到,有些成員可能收不到這個(gè)分組1。

多播路由器多播由特殊的多播路由器來實(shí)現(xiàn),多播路由器同時(shí)也可以是普通路由器。各個(gè)多播路由器每分鐘發(fā)送一個(gè)硬件多播信息給子網(wǎng)上的主機(jī)(目的地址為 244.0.0.1),要求它們報(bào)告其進(jìn)程當(dāng)前所屬的是哪一組,各主機(jī)將它感興趣的 D 類地址返回1。

多播軟件實(shí)現(xiàn)在實(shí)際應(yīng)用中,編程人員通常需要自己編制底層網(wǎng)絡(luò)應(yīng)用程序來實(shí)現(xiàn)網(wǎng)上的底層通信,如具體實(shí)現(xiàn) IP 多播通信的功能。編制底層網(wǎng)絡(luò)應(yīng)用程序通常要借助于網(wǎng)絡(luò)數(shù)據(jù)通信編程接口,而在不同的操作系統(tǒng)中所提供的網(wǎng)絡(luò)編程接口是有所不同的,如在 Microsoft Windows環(huán)境下的網(wǎng)絡(luò)編程接口就是Windows套接字(Windows Socket,簡稱 Winsock)1。

Winsock 提供了包括TCP/IP、IPX等多種通信協(xié)議下的編程接口。不同的 Windows 版本支持不同的 Winsock 版本,本控制軟件系統(tǒng)使用 Winsock 2.0 版本,實(shí)現(xiàn) IP 多播的步驟如下:

1.初始化 Winsock 資源

在使用 Winsock 之前,必須調(diào)用 WSAStartup()函數(shù)初始化 Windows Sockets DLL。它允許應(yīng)用程序或 DLL 指定Windows Sockets API 要求的版本2。

if( WSAStartup( MAKEWORD(2,2),&wsd) != 0 ) { printf("WSAStartup() failed\n"); return ; }2.創(chuàng)建套接字

調(diào)用 WSASocket()函數(shù)可以創(chuàng)建一個(gè)使用 UDP 協(xié)議的套接字,它是加入多播組的初始化套接字,并且以后數(shù)據(jù)的發(fā)送和接收都在該套接字上進(jìn)行2。

if((sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET){ WSACleanup(); return ; }**3.**綁定套接字

調(diào)用 bind()函數(shù)綁定套接字,從而將創(chuàng)建好的套接字與本地地址和本地端口聯(lián)系起來。對(duì)于多播通信來說,發(fā)送和接收數(shù)據(jù)通常采用同一個(gè)端口2。

local.sin_family = AF_INET;local.sin_port = htons(MCASTPORT);local.sin_addr.s_addr = INADDR_ANY;if( bind(sock,(struct sockaddr*)&local,sizeof(local)) ==SOCKET_ERROR ){ closesocket(sock); WSACleanup(); return ; }4. 加入多播組

可以采用以下方式加入多播組2。

remote.sin_family = AF_INET;remote.sin_port = htons(MCASTPORT);remote.sin_addr.s_addr = inet_addr( MCASTADDR );while(( sockM = WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL, JL_BOTH)) == INVALID_SOCKET)5.數(shù)據(jù)的廣播2

void txfs(TCHAR *sendbuf){ sendto(sockM,(char*)sendbuf,1024,0,(struct sockaddr*)&remote,sizeof(remote)); }**6.**數(shù)據(jù)的接收2

UINT txjs(LPVOID param){ recvfrom(sock,recvbuf,BUFSIZE,0,(struct sockaddr*)&from,&len); }