1. 根据网上的说法,在发包的广播代理中添加包头时加入:
hdr_ip* iph = HDR_IP(p);
iph->daddr() = IP_BROADCAST;
即可实现广播
2. 为了达到广播的效果,一般需要设置ttl即跳数,广播为1跳。跳数可在1中同样位置加入:
iph->ttl_ = n;
进行设置,
但是设置后出现问题:从广播节点发出的包经过aodv至目的节点,trace文件中显示目的节点路由层收到了广播包,但目的节点处的代理并没有接到路由层的转发。原因出在ttl_值的设定上(比较诡异,发现错误时完全木有想到哦),设置为1则路由层不会向上转发至代理,设置为2即可。这样既能实现目的节点处代理的接收又能满足广播的跳数要求。
不明确为什么ttl_会影响路由层向上层代理的转发,向上转发也算一跳?
ps:
ns2中代理需要connect,没有该操作或者connect的对象不在通信范围内的话会报错如下:
_o44: no target for slot -1
_o44 type: Classifier/Port
content dump:
classifier _o44
0 offset
0 shift
2147483647 mask
2 slots
slot 0: _o56 (CMUTrace/Recv)
slot 255: _o46 (CMUTrace/Recv)
---------- Finished standard no-slot{} default handler ----------
但实际上作为广播节点,在ad-hoc网络中发包的对象往往都不固定,或者说很有可能移动出通信范围,因此connect到固定的目标不现实,因此有如下解决方法(汗一个,折腾了两天,甚至都用god找邻居列表,最后发现这么简单,so easy噻):
代理可以与自己连接,当然这种连接对于普通的单播代理没有意义,但对于广播代理来说却能很好的解决connect的不固定问题。连接到自身既能避免因为连接对象处于通信范围外带来的报错,又能很好的完成广播任务,被通信范围内的节点接收。