无法发出IGMP report报文

lxd2 2006-12-01 05:14:03
我在程序里面先建立一个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_mreq mreq;
struct ifreq ifreq;
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));

...全文
764 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxd2 2006-12-05
  • 打赏
  • 举报
回复
工具是有啊,但是没有找到能够在linux上开源的能发出报文的程序,要不就可以对比调试一下了!哪位老兄有,不妨帮帮小弟!
evawu999 2006-12-05
  • 打赏
  • 举报
回复
主要是我没有环境 :(
楼主查查看看有没有能够发送组播的小工具。我知道肯定有,但是现在我手上没有。抓报文一看就知道了。
lxd2 2006-12-05
  • 打赏
  • 举报
回复
没有用啊,端口改了还是不能发出report报文,老兄,你能在你的机器上试一下吗?
lxd2 2006-12-04
  • 打赏
  • 举报
回复
我自己顶一下!^_^
evawu999 2006-12-04
  • 打赏
  • 举报
回复
以前做过,现在大部分规则都忘记了,发出来这些帮楼主检查一下,IP地址正确,但是端口是1234我觉得不行,因为report报文,使查询报文的回复,应该与查询报文相同才对。程序应该写成如果接收到了查询报文就发送report报文。我以前用过一个很有用的工具,可用于互发组播报文的,楼主查查,再抓一下包分析一下。别忘了告诉我结果啊!
evawu999 2006-12-04
  • 打赏
  • 举报
回复
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

evawu999 2006-12-04
  • 打赏
  • 举报
回复
四、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报告。

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧