如何在目标节点的 TCP 数据流上接收与源节点的应用程序发送的完全相同的应用程序数据包
How can I receive exactly the same application data packets on a TCP data stream at the destination that was sent by the app at the source node
由于 TCP 连接是一个流,通过网络传输的数据在传输过程中会被分段、缓冲等,因此无法保证数据将以相同的数据包传送到目标应用程序资源。我想在目的地接收与源应用程序发送的数据块完全相同的数据块。或者在短期内,如何在 INET 中正确实施 TCP 消息框架。
诀窍是您必须在应用程序端创建一个缓冲区并将所有接收到的数据块放入该缓冲区。 INET (ChunkQueue) 中有一个特殊的队列class,它允许您对接收到的数据块进行排队,并自动将这些块合并成一个更大的块,该块最初是由另一端的应用层发送的。
实际上,您将所有接收到的数据馈送到队列中,您可以询问队列中是否有足够的数据来构建(一个或多个)由应用层发送的数据块。可以使用队列的has()
方法检查是否存在至少一个应用层数据块,然后使用pop()
方法取出。
更好的是,有一个特殊的回调接口(TcpSocket::ReceiveQueueBasedCallback)可以自动为您将所有接收到的块放入队列中。
如果您在您的应用程序中实现该接口,您只需实现 socketDataArrived(TcpSocket *socket)
方法并定期(每次数据到达时)检查队列内容以查看是否存在足够的数据以能够传送应用程序的原始块。在 INET 的 Ldp 协议实现中有一个这样的例子:
void MyApp::socketDataArrived(TcpSocket *socket)
{
auto queue = socket->getReceiveQueue();
while (queue->has<MyAppMessage>()) {
auto header = queue->pop<MyAppMessage>();
processMyAppMessageFromTcp(header);
}
}
由于 TCP 连接是一个流,通过网络传输的数据在传输过程中会被分段、缓冲等,因此无法保证数据将以相同的数据包传送到目标应用程序资源。我想在目的地接收与源应用程序发送的数据块完全相同的数据块。或者在短期内,如何在 INET 中正确实施 TCP 消息框架。
诀窍是您必须在应用程序端创建一个缓冲区并将所有接收到的数据块放入该缓冲区。 INET (ChunkQueue) 中有一个特殊的队列class,它允许您对接收到的数据块进行排队,并自动将这些块合并成一个更大的块,该块最初是由另一端的应用层发送的。
实际上,您将所有接收到的数据馈送到队列中,您可以询问队列中是否有足够的数据来构建(一个或多个)由应用层发送的数据块。可以使用队列的has()
方法检查是否存在至少一个应用层数据块,然后使用pop()
方法取出。
更好的是,有一个特殊的回调接口(TcpSocket::ReceiveQueueBasedCallback)可以自动为您将所有接收到的块放入队列中。
如果您在您的应用程序中实现该接口,您只需实现 socketDataArrived(TcpSocket *socket)
方法并定期(每次数据到达时)检查队列内容以查看是否存在足够的数据以能够传送应用程序的原始块。在 INET 的 Ldp 协议实现中有一个这样的例子:
void MyApp::socketDataArrived(TcpSocket *socket)
{
auto queue = socket->getReceiveQueue();
while (queue->has<MyAppMessage>()) {
auto header = queue->pop<MyAppMessage>();
processMyAppMessageFromTcp(header);
}
}