直接进入正题,想要实现一发多收,就是要在路由进行广播时转发的兴趣包与接收到数据包的数目相等,即For_num==Rec_num;但正常情况下,路由在第一次接收到数据包时就会把pit条目删除,所以接下来的目的是在接收到数据包对删除pit的命令进行修改。

pit条目修改

先进入到ndnSIM源目录下

然后进入pit-entry.cpp/.hpp所在目录,对这两个文件进行修改。

1
cd NFD/daemon/table/

先对hpp进行修改,添加For_NUM和Rec_NUM两个变量

然后添加获取参数的函数与对变量操作的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int 
get_RecNUM()
{
return Rec_NUM;
}
int
get_ForNUM()
{
return For_NUM;
}
void
afterRec_inter()
{
For_NUM++;
}
void
afterRec_data()
{
Rec_NUM++;
}

接下进行参数的初始化定义,在cpp中实现

转发策略修改

after Recevie Interest

进入forwarder.cpp所在文件夹

1
cd NFD/daemon/fw

修改onOutgoingInterest()函数

after Recevie data

在同一个目录下打开strategy.cpp文件,对sendData()函数进行修改

测试

运行一个具有多个生产者的路由拓扑,查看路由接收的数据包数量,即可确认是否实现一发多收。

有上图可以得出接收的是发送的两倍,实现一发多收。