简体   繁体   English

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

[英]Unable to Call Tcp Socket Received Callback Function on NS3

I am new with NS3.我是 NS3 的新手。 I am trying to create a custom application and currently have a difficulty on calling a Socket callback function using socket->SetRecvCallback.我正在尝试创建一个自定义应用程序,目前在使用 socket->SetRecvCallback 调用 Socket 回调函数时遇到困难。 This problem occur while I use TcpSocketFactory, another socket such as UDP does not produce this issue.当我使用 TcpSocketFactory 时会出现此问题,而另一个套接字(例如 UDP)不会产生此问题。

On main在主要

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

Custom Tcp Application Class自定义 Tcp 应用程序类

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

My callback function我的回调函数

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;
}

Also.还有。 I read from this answer to implements SetAcceptCallback, ns-3 wlan grid TCP not working while UDP is我从这个答案中读到了实现 SetAcceptCallback, ns-3 wlan grid TCP not working while UDP is

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

Callback Function回调函数

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

However, I still cannot log it on the function.但是,我仍然无法将其登录到该功能上。 Did I missing any step?我错过了任何步骤吗?

I got the same problem today.我今天遇到了同样的问题。 After tracing codes for hours, I found that there is no native support for TCP data receiving callback.跟踪代码几个小时,发现没有原生支持TCP数据接收回调。

The tcp-socket-base.cc forks a new TcpSocketBase object for the following data transmission in TcpSocketBase::ProcessListen(). tcp-socket-base.cc 为 TcpSocketBase::ProcessListen() 中的以下数据传输创建了一个新的 TcpSocketBase 对象。 The copy constructor of TcpSocketBase resets new socket's callback functions including m_receivedData . TcpSocketBase 的复制构造函数重置新套接字的回调函数,包括 m_receivedData That's why data receiving callback doesn't work for TCP.这就是为什么数据接收回调对 TCP 不起作用的原因。

A simple workaround is to reserve the callback variable from original TcpSocketBase and make m_receivedDataTCP public in src/network/model/socket.h.一个简单的解决方法是保留原始 TcpSocketBase 的回调变量,并在 src/network/model/socket.h 中公开 m_receivedDataTCP。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM