無法發出IGMP report報文


我在程序里面先建立一個socket, 綁定本地端口,然后通過setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)&mreq, sizeof(mreq))), 這樣來發出一個igmp的report報文. 
現在的問題是, 我做完這個setsockopt之后, 首先函數沒有返回錯誤, 那應該說明我這個函數的執行過程中沒有出錯, 也就是產生了這個包,但是通過ethereal抓包並沒有抓到igmp包。程序如下,希望高人指點(另外linux內核中已經打開muticasting選項)

            int m_hSock;
m_hSock = socket(AF_INET, SOCK_DGRAM, 0);
if(m_hSock == -1){
printf("failed!\n");
printf("socket failed!\n");
return -1;
}
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(1234);
local.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(m_hSock, (struct sockaddr*)&local, 
              sizeof(local)) == -1)
{
printf("failed!\n");
printf("bind failed!\n");
close(m_hSock);
m_hSock = -1;
}
            
            struct ip_mreqmreq;
struct ifreqifreq;
            mreq.imr_multiaddr.s_addr= inet_addr("239.1.1.1");
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
setsockopt(sock, IPPROTO_IP, 
            IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq));


------Solutions------
我自己頂一下!^_^
------Solutions------
四、IGMP:Internet組管理協議

  IGMP 讓一個物理網絡上的所有系統知道主機當前所在的廣播組。多播路由器需要這些信息以便知道多播數據報應該向哪些接口轉發。IGMP也被當作IP層的一部分,IGMP報文通過IP數據報進行傳輸,其報文格式如下:  

4位版本1 4位類型(1-2) 未用 檢驗和 
32位組地址(D類IP地址) 

IGMP類型位1說明是由多播路由器發出的查詢報文,為2說明是主機發出的報告報文。
檢驗和的計算和ICMP協議一樣。
組地址為D類IP地址,在查詢報文中組地址設置為0,在報告報文中組地址為要參加的組地址。

1、加入一個多播組

  進程以某種方式在給定的接口上加入某個多播組,進程也能離開先前加入的多播組。一個進程可以在多個接口上加入同一多播組。主機通過組地址和接口來標識一個多播組。主機必須保留一個表,該表中包含所有至少含有一個進程的多播組及多播組中的進程數量。

2、IGMP報告和查詢
  多播路由器通過IGMP報文來記錄與該路由器相連網絡中組成員的變化情況,規則如下: 

(1) 當第一個進程加入組時,主機就發送一個IGMP報告。如果主機的多個進程加入同一組,只發送一個IGMP報告。這個報告被發送到進程加入組所在的同一接口上。

(2) 進程離開一個組時,主機不發送IGMP報告,即使時組中最后一個進程離開。主機知道在確定的組中已不再由組成員后,在隨后的IGMP查詢中就不再發送報告報文。

(3) 多播路由器定時發送IGMP查詢是否還有任何主機包含有屬於多播組的進程。多播路由器必須向每一個接口發送IGMP查詢。因為路由器希望主機對它加入的每個多播組均返回一個報告,因此IGMP查詢報文中的組地址被設置為0。

(4) 主機通過發送IGMP報告來響應一個IGMP查詢,對每個至少還包含一個進程的組均要發回IGMP報告。

3、實現細節

(1) 當一個主機首次發送IGMP報告時,並不保證該報告被可靠地接收,下一個報告將在間隔一段時間后發送。

(2) 當一個主機收到從一個路由器發出地查詢后,並不立即響應,而是經過一定的時間間隔后才發出一些響應。

(3) 一個主機在等待發送報告的過程中,卻收到了發自其他主機的相同報告,則該主機的響應就不用發送了。

(4) 在沒有任何多播路由器的單個物理網絡中,僅有的IGMP通信量就是在主機加入一個新的多播組時,支持IP多播的主機發送的報告。

4、生存時間字段

  IGMP報告和查詢的生存時間(TTL)均設置為1,這將使多播數據報僅限於同一子網內傳送。更大的TTL值能被多播路由器轉發。224.0.0.0-224.0.0.255的特殊地址使打算用於多播范圍不超過1跳的應用,不管TTL是多少,多播路由器均不轉發目的地址為這些地址中的任何一個地址的數據報。

5、所有主機組

  224.0.0.1地址稱為所有主機組地址,它涉及在一個物理網絡中所有具備多播能力的主機和路由器。當接口初始化后,所有具備多播能力接口上的主機均自動加入這個多播組。這個組的成員無需發送IGMP報告。


------Solutions------
3)IP地址類型

    最初設計互聯網絡時,為了便於尋址和層次化的構造網絡,每個IP地址包括兩個標識碼(ID),即網絡ID和主機ID。同一個物理網絡上的所有主機都用同一個網絡ID,網絡上的一個主機(包括網絡上工作站,服務器和路由器等)有一個主機ID與其對應。IP地址根據網絡ID的不同分為5種類型,A類地址,B類地址,C類地址,D類地址和E類地址。

1)A類IP地址

  一個A類IP地址由1字節的網絡地址和3字節主機地址組成,網絡地址的最高位必須是"0", 地址范圍從1.0.0.0 到126.0.0.0。可用的A類網絡有126個,每個網絡能容納1億多個主機。  

2) B類IP地址

  一個B類IP地址由2個字節的網絡地址和2個字節的主機地址組成,網絡地址的最高位必須是"10",地址范圍從128.0.0.0到191.255.255.255。可用的B類網絡有16,382個,每個網絡能容納6萬多個主機 。

  3)C類IP地址

  一個C類地址是由3字節的網絡地址和1字節的主機地址組成,網絡地址的最高位必須是"110"。范圍從192.0.0.0 - 223.255.255.255 C類網絡達209萬余個,每個網絡能容納254個主機。

  4)D類地址用於多點廣播(Multicast)。

  D類地址第一個字節以"lll0"開始,它是一個專門保留的地址。它並不指向特定的網絡,目前這一類地址被用在多點廣播(Multicast)中。多點廣播地址用來一次尋址一組計算機,它標識共享同一協議的一組計算機。

5)E類地址

  以"llll0"開始,為將來使用保留。

全零("0.0.0.0")地址對應於當前主機。全"1"的IP地址("255.255.255.255")是當前子網的廣播地址。

(4)公有IP地址和私有IP地址

    IP地址依照用途和安全性級別的不同分為公用IP地址和私有IP地址兩種,公有地址在Internet中使用,是由Internet權力機構(亞太區為APNIC、中國為CNNIC)統一分配的,目的是為了保證網絡地址的全球唯一性。私有地址不可以在公網上使用,因為本網絡中的保留地址同樣也可能被其他網絡使用,如果進行網絡互連,那么尋找路由時就會因為地址的不唯一而出現問題。但是這些使用保留地址的網絡可以通過將本網絡內的保留地址翻譯轉換成公共地址的方式實現與外部網絡的互連。這也是保證網絡安全的重要方法之一。

在IP地址的主要三種類型里,各保留了三個區域作為私有地址,其地址范圍如下: 

A類地址:10.0.0.0~10.255.255.255 

B類地址:172.16.0.0~172.31.255.255 

C類地址:192.168.0.0~192.168.255.255 


------Solutions------
以前做過,現在大部分規則都忘記了,發出來這些幫樓主檢查一下,IP地址正確,但是端口是1234我覺得不行,因為report報文,使查詢報文的回復,應該與查詢報文相同才對。程序應該寫成如果接收到了查詢報文就發送report報文。我以前用過一個很有用的工具,可用於互發組播報文的,樓主查查,再抓一下包分析一下。別忘了告訴我結果啊!
------Solutions------
沒有用啊,端口改了還是不能發出report報文,老兄,你能在你的機器上試一下嗎?
------Solutions------
主要是我沒有環境 :(
樓主查查看看有沒有能夠發送組播的小工具。我知道肯定有,但是現在我手上沒有。抓報文一看就知道了。
------Solutions------
工具是有啊,但是沒有找到能夠在linux上開源的能發出報文的程序,要不就可以對比調試一下了!哪位老兄有,不妨幫幫小弟


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM