无法在NS3上调用Tcp套接字接收回调函数

时间:2016-05-23 07:29:15

标签: c++ ns-3

我是NS3的新手。我正在尝试创建一个自定义应用程序,目前使用socket-> SetRecvCallback调用Socket回调函数时遇到困难。当我使用TcpSocketFactory时出现此问题,另一个套接字(如UDP)不会产生此问题。

主要

Ptr<Socket> ns3TcpSocket = Socket::CreateSocket(nodes.Get(0), TcpSocketFactory::GetTypeId());

自定义Tcp应用程序类

this->socket->SetRecvCallback(MakeCallback(&CustomTcpApplication::RecvCallback, this));
this->socket->SetSendCallback(MakeCallback(&CustomTcpApplication::WriteUntilBufferFull, this));

我的回调功能

void CustomTcpApplication::RecvCallback(Ptr<Socket> socket)
{
    std::cout << "On Receive Callback Function" << std::endl;
}


void CustomTcpApplication::WriteUntilBufferFull(Ptr<Socket> localSocket, uint32_t txSpace)
{
    std::cout << "On Send Callback Function" << std::endl;
}

另外。我从这个答案中读到了实现SetAcceptCallback,ns-3 wlan grid TCP not working while UDP is

this->socket->SetAcceptCallback(MakeNullCallback<bool, Ptr<Socket>, const Address &>(), MakeCallback(&CustomTcpApplication::Accept, this));

回调功能

void CustomTcpApplication::Accept(Ptr<Socket> socket, const ns3::Address& from)
{
    std::cout << "Connection accepted" << std::endl;
    socket->SetRecvCallback(MakeCallback(&CustomTcpApplication::MainRecvCallback, this));
}

但是,我还是无法在功能上记录它。我错过了任何一步吗?

1 个答案:

答案 0 :(得分:0)

我今天遇到了同样的问题。跟踪代码数小时后,我发现对TCP数据接收回调没有本地支持。

tcp-socket-base.cc派生一个新的TcpSocketBase对象,用于在TcpSocketBase :: ProcessListen()中进行以下数据传输。 TcpSocketBase的副本构造函数将重置新的套接字的回调函数,包括m_receivedData 。这就是为什么数据接收回调不适用于TCP。

一个简单的解决方法是保留原始TcpSocketBase中的回调变量,并在src / network / model / socket.h中将m_receivedDataTCP公开。

TcpSocketBase::TcpSocketBase (const TcpSocketBase& sock)
{
   ...
   m_receivedDataTCP = sock.m_receivedDataTCP;
}