在提出问题之前,我想告诉我,我已经搜索了一个多月了。我会说我知道ns2,但我肯定能够理解你会说的任何事情[希望]
我想实现广度优先搜索(BFS)并在NS2中的无线移动节点拓扑中创建BFS树。 [让我们先做静态系统。]
我的挑战:向节点的所有邻居多播消息。
现在我在想象中想到了
这些可能有哪些?
答案 0 :(得分:3)
好的,所以在完成我的项目后,我想分享我是如何做到的。我还在学习,但是,我是这样做的。
场景是无线。
在NS中生成节点很简单:
设置节点(0)[$ ns node]
设置节点(1)[$ ns node]
其中nodes是一个数组。
设置节点的位置:
$ nodes(0)设置X_ 20.0
$ nodes(0)设置Y_ 100.0
您可以使用某种数学方程式来生成节点拓扑。即他们的定位。查看ns2-directory / tcl / ex / wireless-flooding.tcl。
为每个节点生成代理并将其与节点连接。
设置座席(0)[新座席/ MyAgent]
$ nodes(0)attach-agent $ agents(0)$ MESSAGE_PORT
由于协议的所有逻辑工作都在代理中完成,因此我们创建了一个MyPgent的cpp类。也可以在Makefile中添加它。
类MyAgent:公共代理{
//覆盖recv()函数。
//为此类添加命令函数,只要该类的对象被要求在tcl文件中执行某些操作,就会调用该函数。
//用于存储来自PING和PING_REPLY的邻居地址 std :: vector myNeighbors;
}
然后每个代理都广播PING消息并使用PING_REPLY消息回复给发件人。
这可以通过使用参数addr_ = -1
发送地址ns_addr_t来完成 ns_addr_t naddr;
naddr.addr_ = -1
这些消息是不同类型的数据包,并在cpp类中再次创建,如
枚举类型{PING,PING_REPLY};
班级HdrPing {
类型类型;
// getter和setter函数以及offset等其他变量。
}
为了编写接收任何消息的逻辑,这与我们的分布式协议的制作方式完全相同,我们覆盖了Agent的recv()
void MyAgent :: recv(Packet * p,Handle * h){
开关(HdrPing :: access(p) - > type){
case PING:
// send PING_REPLY back to sender and add the source of the packet p
// to my neighbor list.
// we can get it from ipHdr->saddr(), which is source address in the
// IP header of the packet.
break;
case PING_REPLY:
// add the sender of messge to my neighbor list.
break;
// other types of messages are also programmed here.
} //关闭开关
}
通过这种方式,我知道谁是我的邻居。
可以添加更多类型的消息和更多功能。