2017-07-28 50 views
0

我想修改ns2模拟器中某个节点的行为。特别是,我必须在dsr协议的模拟中修改节点的路由。 我知道dsragent.cc是管理此协议路由的类。但是如果我有一个带有10个节点的tcl脚本,名为$ node1,$ node2 ... node $ 10,如何修改dsr协议中$ node5的行为?如何找到该节点的单一行为?如何修改ns2模拟器中某个节点的行为?

回答

1

我曾与其他路由协议,但我会提到一些点..可能是有用的。

为了访问C++中的特定节点对象,你需要知道它在tcl中的地址。则可能需要进行修改正向或recv函数.. 可以提取需要形成共同,IP的所有信息,DSR头

DSRAgent::recv(Packet* packet, Handler*) 
    /* handle packets with a MAC destination address of this host, or 
    the MAC broadcast addr */ 
{ 
     hdr_sr *srh = hdr_sr::access(packet); 
     hdr_ip *iph = hdr_ip::access(packet); 
     hdr_cmn *cmh = hdr_cmn::access(packet); 
     p.dest = ID((Address::instance().get_nodeaddr(iph->daddr())),::IP); 
     p.src = ID((Address::instance().get_nodeaddr(iph->saddr())),::IP); 

以下手段..如果当前节点是该分组的发生器

if (p.src == net_id) {code} 

选择特定的节点对象

if (net_id==ID("put the node address here", ::IP))  \\ notice net_id is a struct 
    { 
     your code here 
    } 

你可以从TCL 而这个地址分配节点地址将命令的功能传递到C++

DSRAgent::command(int argc, const char*const* argv) 
. 
. 
if (strcasecmp(argv[1], "addr") == 0) 
    { 
     int temp; 
     temp = Address::instance().str2addr(argv[2]); 
    net_id = ID(temp, ::IP); 
    flow_table.setNetAddr(net_id.addr); 
. 
} 

问候

+0

谢谢你的答复。你能帮我解决吗? https://stackoverflow.com/questions/47359275/arrange-nodes-in-ns2在此先感谢。 – legolas07

+0

当然..我会看到它。 –