IP組播網路程式設計
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()組播命令的說明
對於套接字程式設計,首先要使用函式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@]
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命令中相同的值。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1040910/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- IP組播
- 小區廣播背景音樂IP網路廣播系統方案設計概要
- 大學校園IP網路廣播-基於校園區域網的大學校園IP廣播方案設計指南
- Java 基於UDP 實現單播、組播、廣播 Socket 程式設計JavaUDP程式設計
- 旅遊景區IP網路廣播系統方案-旅遊風景區景點IP網路廣播建設指南
- 小學校園IP網路廣播-基於校園區域網的小學IP數字廣播系統設計
- 酒廠酒業IP網路廣播系統建設-基於區域網的新一代互動智慧酒廠酒業IP網路廣播設計指南
- 中學校園IP網路廣播系統解決方案-校園數字IP廣播系統方案設計指南
- 組播IP地址到底是誰的IP?
- 校園IP網路廣播系統方案
- TCP/IP網路程式設計模型TCP程式設計模型
- 網路程式設計TCP/IP詳解程式設計TCP
- Python網路程式設計——IP、UDPPython程式設計UDP
- IP組播基礎及工作原理——1
- 3.Java網路程式設計之IPJava程式設計
- 網路通訊程式設計程式設計
- 網路協程程式設計程式設計
- Socket 程式設計 (網路篇)程式設計
- py網路工具程式設計程式設計
- IP&IP地址、ipv4&ipv6、子網掩碼、網段計算、網路廣播ID計算、預設閘道器、DNS伺服器、DHCP伺服器DNS伺服器
- [計算機網路]TCP/IP計算機網路TCP
- 【Linux網路程式設計】位元組序Linux程式設計
- Go語言中的TCP/IP網路程式設計GoTCP程式設計
- Socket、TCP/IP、HTTP、FTP及網路程式設計TCPHTTPFTP程式設計
- Python網路Socket程式設計Python程式設計
- 如何搭建和設計企業組網的網路架構?架構
- python 網路篇(網路程式設計)Python程式設計
- 網路和IP地址計算器
- Linux網路程式設計--TCP/IP協議(轉)Linux程式設計TCP協議
- 網路程式設計-計算機網路三要素程式設計計算機網路
- iOS 網路程式設計(一)TCP IP協議簡介iOS程式設計TCP協議
- 如何程式設計設定本機IP地址?程式設計
- 網路系統組成、OSI模型、TCP/IP協議簇模型TCP協議
- 音影片處理技術中的IP組播技術
- 網路和IP
- qt獲取本機IP地址、計算機名、網路連線名、MAC地址、子網掩碼、廣播地址QT計算機Mac
- 淺談 TCP/IP 網路程式設計中 socket 的行為TCP程式設計
- 解析原生IP和廣播IP