IP組播網路程式設計

helloxchen發表於2010-11-04

IP組播網路程式設計

:轉載時請以超連結形式標明文章原始出處和作者資訊及本宣告
http://leezen.blogbus.com/logs/19625232.html

5.2 組播應用程式介面與程式設計
RFC1112推薦了一些支援組播的應用程式介面:
●加入一個組播組;
●離開一個組播組;
●為調整範圍對一個組播資料的IP TTL值進行設定;
●為組播傳輸和接收設定本地的介面;
●禁止輸出的組播資料回送。
現在,許多TCP/IP實現都支援RFC1112所提到的要求,下面簡要介紹UNIX(Berkeley Socket)和Windows(Winsock) API。
5.2.1 Berkeley Socket組播API
所有Berkeley Socket API都採用setsockopt()的“套接字選項”功能來設定(對於某些選項,getsockopt()功能可用來獲得當前的設定)。表3描述了Berkeley BSD的set sockopt()/getsockopt()組播命令。
表3 BSD setsockopt()/getsockopt()組播命令的說明

setsockopt()/getsockopt()組播命令 命令說明
IP_MULTICAST_TTL 設定輸出組播資料的TTL
IP_ADD_MEMBERSHIP 在指定介面上加入組播組
IP_DROP_MEMBERSHIP 退出組播組(在IGMPv2中實現)
IP_MULTICAST_IF 獲取預設介面或設定介面
IP_MULTICAST_LOOP 禁止組播資料回送


對於套接字程式設計,首先要使用函式socket()建立一個資料包套接字,然後用bind()函式將套接字與一個地址和埠號連線起來。
為了傳送一個組播資料包,需要在sendto()呼叫中指定一個組播地址作為目的地址(所有IP地址都使用網路位元組順序)。
為了接收一個組播資料包,需要在recvfrom()呼叫中指定所要接收的組播地址。
IP_MULTICAST_TTL允許將隨後的組播資料的TTL設定成從0到255之間的任何值,例如:
u_char ttl;
setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));
關於TTL的討論見上文。
透過IP_MULTICAST_IF,系統管理員可在安裝的時候為組播建立預設的介面(為從一個給定的網路介面併發傳送,一個網路介面會忽略這個預設值)。例如:
struct in_addr addr;
setsockopt(sock,IPPROTO_IP,IP_MULTICAST_IF,&addr,sizeof(addr));
在這裡,addr是希望輸出介面的本地IP地址,可使用一個INADDR_ANY地址來回送到預設的介面。
當組播組中的一臺主機傳送組播資料到輸出介面時,預設的IP層將為本地回送資料的複製。
IP_MULTICAST_LOOP網路引數控制IP層是否回送所送的資料。例如:
u_char loop;
setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop));
將loop設定為0則禁止回送,設定為1則允許回送。
為了能夠接收IP組播資料,主機必須加入某個或多個組播組,程式透過使用IP_ADD_MEMBERSHIP網路介面引數向主機提出加入組播組的申請。例如:
struct ip_mreq
{struct in_addr imn_multiaddr; /* multicast group to join */
struct in_addr imr_interface; /* interface to join on */
}mreq;
setsockopt(sock,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
一個組的成員是與一個單一的網路介面相聯絡;主機可在不止一個網路介面上加入相同的組。若選擇預設組播介面,要將imr_interface設定為INADDR_ANY;若選擇主機其中一個本地地址,要將imr_interface設定為特定的組播介面。
若撤消一個成員資格,使用IP_DROP_MEMBERSHIP
struct ip_mreq mreq;
setsockopt(sock,IPPROTP_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(sreq));
其中mreq包含了在IP_ADD_MEMBERSHIP命令中相同的值。
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1040910/,如需轉載,請註明出處,否則將追究法律責任。

相關文章