问题描述
我目前正在尝试在 ns-3 (ns-3.33) 模拟器中创建路由协议。
我的项目目前为每个可用的网络接口制作 2 个套接字,一个用于从它的 ip 发送/接收,另一个用于接收广播。它现在使用两种类型的数据包(虽然列出了 5 种类型):侦察和确认数据包。想要将数据发送到某个其他节点的节点广播找到目标节点的侦察数据包。然后,目标节点应该按照侦察员来的方式发回确认包(侦察员经过的每个节点都记录了将确认包发回的方式)。
现在广播工作正常——侦察兵到达目标节点;但我无法让目标发回确认(在可视化器上,发送显示为一条无处可去的红线)。我可以确认确认数据包通过 RouteOutput 并返回路由,但没有节点收到数据包。不再调用 RouteOutput/RouteInput 或套接字回调。
我做错了什么?
这是我设置套接字的方式:
Ptr<Ipv4L3Protocol> l3 = m_ipv4->Getobject<Ipv4L3Protocol>();
for (uint32_t i = 0; i < m_ipv4->GetNInterfaces(); i++) {
Ipv4InterfaceAddress iface = l3->GetAddress(i,0);
if (iface.GetLocal() == Ipv4Address("127.0.0.1")) continue; // nothing to do with loopback iface
//socket for address e.g. 10.1.1.25
Ptr<Socket> socket = Socket::CreateSocket(Getobject<Node>(),UdpSocketFactory::GetTypeId());
NS_ASSERT(socket != 0);
socket->SetRecvCallback(MakeCallback(&BeeRoutingProtocol::RecvBeefw,this));
socket->BindToNetDevice(l3->GetNetDevice(i));
socket->Bind(InetSocketAddress(iface.GetLocal(),BEEFW_PORT));
socket->SetAllowbroadcast(true);
socket->SetIpRecvTtl(true);
m_UCastSocketAddresses.insert(std::make_pair(socket,iface));
NS_LOG_DEBUG("created unicast socket with address " << iface.GetLocal());
// socket for broadcast address e.g. 10.1.1.255
socket = Socket::CreateSocket(Getobject<Node>(),this));
socket->BindToNetDevice(l3->GetNetDevice(i));
socket->Bind(InetSocketAddress(iface.Getbroadcast(),BEEFW_PORT));
socket->SetAllowbroadcast(true);
socket->SetIpRecvTtl(true);
m_BCastSocketAddresses.insert(std::make_pair(socket,iface));
NS_LOG_DEBUG("created broadcast socket with address " << iface.Getbroadcast());
}
我这样发送数据包:
Ptr<Socket> BeeRoutingProtocol::findUCastSocket(Ipv4InterfaceAddress addr) {
for(auto entry : m_UCastSocketAddresses) if(entry.second == addr) return entry.first;
return nullptr;
}
void BeeRoutingProtocol::SendBee(Ipv4InterfaceAddress iface,Ptr<Packet> packet,Ipv4Address destination) {
NS_LOG_LOGIC("sending packet to " << destination);
auto socket = findUCastSocket(iface);
if(socket == nullptr) NS_LOG_DEBUG("Couldn't find the socket for iface: " << iface);
auto res = socket->SendTo(packet,InetSocketAddress(destination,BeeRoutingProtocol::BEEFW_PORT));
if(res == -1) NS_LOG_DEBUG("SendTo returned an error");
}
void BeeRoutingProtocol::ScheduleBee(Ipv4InterfaceAddress iface,Ipv4Address destination) {
Simulator::Schedule(Time (MilliSeconds(GetUniformRandomInteger(1,10))),&BeeRoutingProtocol::SendBee,this,iface,packet,destination);
}
{ //send ackNowledge
SocketIpTtlTag tag; tag.SetTtl(1);
auto tHeader = BeePacketHeader(); tHeader.SetoriginatorAddress(dest); tHeader.SetDestinationAddress(orig); tHeader.SetPacketType(BEEACK);
packet = Create<Packet>(); packet->AddPacketTag(tag); packet->AddHeader(tHeader);
BeeRoutingTableEntry e;
if(m_rtable.Find(orig,e)) {
auto route = e.m_ipv4Route;
auto hop = route->GetGateway();
NS_ASSERT(route != nullptr); NS_LOG_FUNCTION("hop" << hop << "iface" << e.m_routeIface);
ScheduleBee(e.m_routeIface,hop);
}
}
数据包路由记录在路由表中 当它们像这样穿过每个节点时:
{ //add route to sending neighbor and to origin
auto dev = m_ipv4->GetNetDevice(static_cast<uint32_t>(m_ipv4->GetInterfaceForAddress(receiver)));
BeeRoutingTableEntry e;
if(!m_rtable.Find(sender,e)) m_rtable.Add(BeeRoutingTableEntry(iface,dest,sender,dev)); // route to neighbor
if(!m_rtable.Find(orig,orig,dev)); // route to origin
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)