【问题标题】:Socket Handle Read Is never read In Ns3在 Ns3 中从不读取套接字句柄读取
【发布时间】:2022-11-04 13:07:52
【问题描述】:

我呆了很多天才找到错误在哪里,我被卡住了。谁能帮助我。

我的应用程序是 NS3 中的一个集群程序,它是由别人编写的,对任何人都是免费的。 程序运行,没有错误并打印消息,但每个簇头 CH 中的邻居数始终为零,这意味着错误消息不会到达每个节点,每个节点都将自己视为簇头,因为它没有看到任何邻居节点!。每个节点(车辆)都有两个套接字,一个用于发送数据m_socket和一个听m_socket监听,代码为:

if (!m_socket)
 {
    //  TypeId::LookupByName ("ns3::UdpSocketFactory
    
    TypeId m_tid = TypeId::LookupByName("ns3::UdpSocketFactory");
    //m_socket = Socket::CreateSocket(GetNode() , TypeId::LookupByName("ns3::UdpSocketFactory"));
    m_socket = Socket::CreateSocket(GetNode(), m_tid);
    // i added the down line

  // InetSocketAddress remote = InetSocketAddress(Ipv4Address::GetBroadcast(),80);

    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(Ipv4Address::GetBroadcast());
     m_socket->Connect(m_peer);

}

现在这是监听套接字创建的一部分

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("\n 这个消息永远不会被执行.."); 运行程序时从不打印,这意味着句柄读取永远不会被执行.任何帮助都非常感谢

【问题讨论】:

  • 我猜你应该在m_socketListening 上设置回调打电话给Listen。我会进一步猜测,监听套接字会生成一个接受回调,但不会生成一个 recv 回调。
  • 非常感谢您的回复。但是我按照你的建议做了,我把listen语句放在回调之后,没有任何改变,我不明白第二个建议,你是说监听套接字不应该有accept callbak吗?我试图取消 setacceptcallback 并没有改变,设置监听套接字代码的最佳方法是什么?另外我跟踪了数据包是从源节点的所有层发送的,我注意到它是由 netdevice mac 层接收的,所以为什么没有调用句柄读取,本地地址是否正确,非常感谢您的帮助
  • 我说监听套接字可能会触发 Accept 回调,但不会触发 Recv 回调。而HandleRead 实际上是recv 回调,所以它没有被调用也就不足为奇了。我不熟悉您正在使用的库,但“普通”套接字是这样工作的。你有一个监听套接字。当传入连接到达时,您在该套接字上调用 Accept - 返回另一个代表此特定连接的套接字。然后你在那个接受的套接字上读写,而监听套接字继续监听更多的连接。
  • 感谢您的回复和耐心,因为我有大约一个月没有解决方案。首先是你熟悉 NS3 模拟器,这是 ns3 中的一个应用程序,也是我从你那里了解到的,你认为监听套接字在服务器上,不。例如,我有 5 个节点移动(wifi 并具有移动性),每个节点都有两个套接字,一个用于 sendind,另一个仅用于监听广播。所以监听套接字正在监听信标消息。如果您有 NS3 的经验,您能否在代码中建议我必须做什么。非常感谢你。
  • 侦听套接字用于接受传入连接。无论您将侦听和接受连接的程序称为“服务器”还是其他什么都无关紧要。不,我不熟悉NS3,以前从未听说过。

标签: c++ sockets debugging simulation handle


【解决方案1】:

Mohsen 你有没有解决这个问题,因为我也面临这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2013-10-12
    • 1970-01-01
    相关资源
    最近更新 更多