【发布时间】: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