我如何在源节点的应用程序发送的目标TCP数据流上接收完全相同的应用程序数据包

我如何在源节点的应用程序发送的目标TCP数据流上接收完全相同的应用程序数据包,tcp,omnet++,inet,Tcp,Omnet++,Inet,由于TCP连接是一个流,在传输过程中,通过网络传输的数据会被分割、缓冲等,因此无法保证数据将以与源发送相同的数据包发送到目标应用程序。我希望在目的地接收与源应用程序发送的数据完全相同的数据块。或者在短期内,如何在INET中正确实现TCP消息帧。诀窍在于必须在应用程序端创建一个缓冲区,并将所有接收到的数据块放入该缓冲区。INET()中有一个特殊的queue类,它允许您对接收到的数据块进行排队,并自动将这些数据块合并到最初由另一端的应用程序层发送的更大的数据块中 实际上,您将所有接收到的数据馈送到队

由于TCP连接是一个流,在传输过程中,通过网络传输的数据会被分割、缓冲等,因此无法保证数据将以与源发送相同的数据包发送到目标应用程序。我希望在目的地接收与源应用程序发送的数据完全相同的数据块。或者在短期内,如何在INET中正确实现TCP消息帧。

诀窍在于必须在应用程序端创建一个缓冲区,并将所有接收到的数据块放入该缓冲区。INET()中有一个特殊的queue类,它允许您对接收到的数据块进行排队,并自动将这些数据块合并到最初由另一端的应用程序层发送的更大的数据块中

实际上,您将所有接收到的数据馈送到队列中,您可以询问队列中是否有足够的数据来构建应用层发送的(一个或多个)块。您可以使用队列的
has()
方法检查是否至少存在一个应用层数据块,然后使用
pop()
方法将其取出

更好的是,有一个特殊的回调接口(),可以自动将所有接收到的块放入队列中

如果在应用程序中实现该接口,则只需实现
socketDataArrived(TcpSocket*socket)
方法,并定期(每次数据到达时)检查队列内容,以查看是否存在足够的数据,以便能够将原始数据块交付给应用程序。INET中的协议实现中有一个例子:

void MyApp::socketDataArrived(TcpSocket *socket)
{
    auto queue = socket->getReceiveQueue();
    while (queue->has<MyAppMessage>()) {
        auto header = queue->pop<MyAppMessage>();
        processMyAppMessageFromTcp(header);
    }
}
void MyApp::socketDataArrived(TcpSocket*socket)
{
自动队列=套接字->getReceiveQueue();
while(队列->has()){
自动标头=队列->弹出();
processMyAppMessageFromTcp(标头);
}
}