1.概念
單播是用於兩個主機之間傳送資料,廣播是乙個主機對區域網內的所有主機傳送資料。而多播,又稱為組播,它是對一組特定的主機通訊。將網路上同一型別 業務邏輯上分組,只和組內的成員通訊,其它主機沒有加入組則不能通訊。與單播相同的是,組播允許在internet上通訊,而廣播只是同一區域網內的主機 通訊。組播位址是特定的,d類位址用於組播,即244.0.0.0到239.255.255.255. 並劃分為區域性連線多播位址,預留多播位址和管理許可權多播位址3類。
(1)區域性多播位址 (224.0.0.-224.0.0.255)為路由協議和其它用途保留的位址,路由器不**此範圍的ip包
(2)預留多播位址 (224.0.1.0-238.255.255.255)可用於全球範圍內或網路協議
(3)管理許可權的多播 (239.0.0.0-239.255.255.255) 可供組織內使用,型別於私有ip,不用於internet,可限制多播範圍
224.0.0.1 所有組播主機
224.0.0.2 所有組播路由器
224.0.0.4 drmrp路由器
224.0.0.5 所有ospf的路由器
224.0.0.6 ospf指派路由器
224.0.0.9 rpiv2路由器
224.0.0.10 eigrp路由器
224.0.0.13 pim路由器
224.0.0.22 igmpv3
224.0.0.25 rgmp
224.0.1.1 ntp網路時間協議ip到乙太網位址對映
因為乙太網支援多種協議,所以要採取措施分配多播位址,避免衝突。ieee管理乙太網多播位址分配。ieee把一塊乙太網多播位址分給iana以支援ip多播。塊的位址都以01:00:5e開頭。
第25位為0,低23位為ipv4組播位址的低23位。ipv4組播位址與mac位址的對映關係如圖所示:
由於多播組號中的最高5bit在對映過程中被忽略,因此每個乙太網多播位址對應的多播組是不唯一的。32個不同的多播組號被對映為乙個乙太網位址。例如,多播位址
224.128.64.32(十六進製制e0.80.40.20)和224.0.64.32(十六進製制e0.00.40.20)都對映為同一乙太網位址01:00:5e:00:40:20。
2. 多播套接字設定
可用setsockopt或getsockopt設定或得到多播選項. 常用的多播選項如下所示:
ip_multicast_ttl 設定多播的ttl值
ip_multicast_if 獲取或設定多播介面
ip_multicast_loop 禁止多播資料回送到本地loop介面
ip_add_membership 將指定的介面加入多播
ip_drop_membership 退出多播組
struct ip_mreq
int ttl=255;
setsockopt(s,ipproto_ip,ip_multicast_ttl,&ttl,sizeof(ttl));//設定跳數
s-套接字描述符
proto_ip-選項所在的協議層
ip_multicast_ttl-選項名
&ttl-設定的記憶體緩衝區
sizeof(ttl)-設定的記憶體緩衝區長度
struct in_addr in;
setsockopt(s,ipproto_ip,ip_mutlicast_if,&in,sizeof(in));//設定組播介面
int yes=1;
setsockopt(s,ipproto_ip,ip_multicast_loop,&yes,sizeof(yes));//設定資料回送到本地回環介面
struct ip_mreq addreq;
setsockopt(s,ipproto_ip,ip_add_membership,&req,sizeof(req));//加入組播組
struct ip_mreq dropreq;
setsockopt(s,ipproto_ip,ip_drop_membership,&dropreq,sizeof(dropreq));//離開組播組
3. 多播程式的設計流程
(1)建立socket
(2)設定ttl值 ip_multicast_ttl
(3)設定是否允許本地回環 ip_multicast_loop
(4)加入多播組 ip_add_membership
(5)傳送資料 send
(6)接收資料 recv
(7)退出多播組 ip_drop_membership
注意: tcp協議也不能用於多播.
4. 多播例項
伺服器端不停的向加入多播組的主機傳送資料.
伺服器:
#include
#include
#include
#include
#include
#include
//多播的客戶端程式
#define port 8888
#define mcast "224.0.0.88"
int main(int argc,char*argv)
//多播的位址結構
localaddr.sin_family=af_inet;
localaddr.sin_port=htons(port);//多播埠號
localaddr.sin_addr.s_addr=htonl(inaddr_any);//接收任意位址傳送的資料
//繫結位址結構到套接字
ret=bind(s,(struct sockaddr*)&localaddr,sizeof(localaddr));//客戶端需要繫結埠,用來接收伺服器的資料,得指定接收埠,因為資料先從伺服器傳送過來的
if(ret<0)
//設定多播的ttl值
if(setsockopt(s,ipproto_ip,ip_multicast_ttl,&ttl,sizeof(ttl))<0)
//設定資料是否傳送到本地回環介面
if(setsockopt(s,ipproto_ip,ip_multicast_loop,&loop,sizeof(loop))<0)
//客戶端加入多播組
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr=inet_addr(mcast);//多播組的ip
mreq.imr_inte***ce.s_addr=htonl(inaddr_any);//本機的預設介面ip
if(setsockopt(s,ipproto_ip,ip_add_membership,&mreq,sizeof(mreq))<0)
//迴圈接收多播組的訊息,5次退出
for(times=0;times<20;times++)
printf("receive message:%s\n",buffer);
printf("port is:%d\n",fromaddr.sin_port);
size=sendto(s,"ok",2,0,(struct sockaddr*)&fromaddr,sizeof(fromaddr));//向伺服器傳送資料,向伺服器指定的ip與埠傳送資料
}//離開多播組
ret=setsockopt(s,ipproto_ip,ip_drop_membership,&mreq,sizeof(mreq));
if(ret<0)
close(s);
return 0;
}說明:設定主機的ttl值,是否允許本地回環,加入多播組,然後伺服器向加入多播組的主機傳送資料,主機接收資料,並響應伺服器。
Linux網路程式設計之多程序
多程序模型 多程序模型下,注意如何在程序之間通訊以及孤兒程序和殭屍程序的處理,可以外配上程序池作為計算任務 非同步任務的處理。fork server include include include include include include include include include voi...
Linux網路程式設計之多執行緒
多執行緒模型 在多執行緒模型下,注意共享資料的同步,mutex condition variable rw lock等的使用,local thread storage的使用,另外,可以搭配執行緒池處理非同步計算任務。在c 11中的執行緒庫中已經提供了future相關的工具,合理地使用執行緒模型減少資...
Linux網路程式設計之多路I O復用
1.select函式 include int select int nfds,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout void fd clr int fd,fd set set int fd iss...