You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NS3中Socket的HandleRead回调从未触发问题求助

基于NS3的V2V聚类程序Hello消息无法送达问题求助

我耗时多日排查仍未解决问题,特来求助。我的应用是基于NS3的开源聚类程序,运行无报错且有日志输出,但所有*簇头(CH)*的邻居数始终为0,这表明Hello消息未送达节点,每个节点因未发现邻居而自认为是簇头。

每个节点(车辆)拥有两个Socket:用于发送数据的m_socket和用于监听的m_socketListening,相关代码如下:

发送Socket创建代码

if (!m_socket)
 {
    TypeId m_tid = TypeId::LookupByName("ns3::UdpSocketFactory");
    m_socket = Socket::CreateSocket(GetNode(), m_tid);

    if (Inet6SocketAddress::IsMatchingType(m_peer)) 
    {
        m_socket->Bind6();
    } 
    else if (InetSocketAddress::IsMatchingType(m_peer)
            || PacketSocketAddress::IsMatchingType(m_peer))
    {
         
        m_socket->Bind();
    }
   
    m_socket->SetAllowBroadcast(true);
    m_socket->ShutdownRecv();
    
    m_socket->SetConnectCallback(
        MakeCallback(&V2vControlClient::ConnectionSucceeded, this),
        MakeCallback(&V2vControlClient::ConnectionFailed, this));
    m_socket->Connect(m_peer);
}

监听Socket创建代码

if (!m_socketListening)
{
    NS_LOG_UNCOND("\n ...creating socket muhsen...");
    m_socketListening = Socket::CreateSocket(GetNode(), m_tidListening);
    m_socketListening->Bind(m_peerListening);
    m_socketListening->Listen();
    m_socketListening->ShutdownSend();
    if (addressUtils::IsMulticast(m_peerListening)) 
    {
        Ptr<UdpSocket> udpSocket = DynamicCast<UdpSocket>(m_socketListening);
        if (udpSocket)
        {   
            // equivalent to setsockopt (MCAST_JOIN_GROUP)
            udpSocket->MulticastJoinGroup(0, m_peerListening);
        } 
        else 
        {
            NS_FATAL_ERROR("Error: joining multicast on a non-UDP socket");
        }
    }
}

m_socketListening->SetRecvCallback(MakeCallback(&V2vControlClient::HandleRead, this));
m_socketListening->SetAcceptCallback(
        MakeNullCallback<bool, Ptr<Socket>, const Address &>(),
        MakeCallback(&V2vControlClient::HandleAccept, this));
m_socketListening->SetCloseCallbacks(
        MakeCallback(&V2vControlClient::HandlePeerClose, this),
        MakeCallback(&V2vControlClient::HandlePeerError, this));

void V2vControlClient::HandleRead (Ptr<Socket> socket)
{
    NS_LOG_UNCOND("\n this message is never executed..");

    NS_LOG_FUNCTION (this << socket);
    Ptr<Packet> packet;
    Address from;

    while ((packet = socket->RecvFrom(from)))
    {
        if (packet->GetSize() == 0) 
        { //EOF
            break;
        }
    }
}

运行程序时,HandleRead函数内的NS_LOG_UNCOND日志从未打印,说明该回调从未被执行,恳请各位提供帮助!

内容的提问来源于stack exchange,提问作者Muhsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:20:47