QTcpServer- QTcpSocket 确认问题

Posted

技术标签:

【中文标题】QTcpServer- QTcpSocket 确认问题【英文标题】:QTcpServer- QTcpSocket acknowledgement question 【发布时间】:2011-07-06 18:44:02 【问题描述】:

-->我正在使用QTcpSocket,QTcpServer编写程序。我是否需要添加一些代码(即确认程序)来保证数据包被传递? 如果是这样的话,我在网上找不到类似的东西,所以想看看一些例子,拜托。

-->或者在某个地方的QT库中,这些已经被覆盖了,所以我不需要这样的东西?

任何帮助将不胜感激。 谢谢。

编辑: 现在,我在问如何将标题与我在下面添加的 QDataStream 块一起使用。我希望每个块都有标题来告诉信息。这样我就可以跟踪哪些部分被写入,哪些部分丢失。请看下面。

///RECEIVER SIDE

QDataStream in(socket);
in.setVersion(QDataStream::Qt_4_0);

QByteArray next;
next=socket->readAll(); 

QFile output("c:\\some\\output.txt");
output.open(QIODevice::Append);
output.write(next);
output.close();


///SENDER SIDE
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);

QFile file(path);
if(file.exists())
         file.open(QIODevice::ReadOnly);    


QByteArray data; 
data=file.readAll();
block.append(data);

out << (quint64)0;
out.device()->seek(0);
if(!socket->waitForBytesWritten())
    qDebug()<<"writing";
 socket->write(block);
 socket->flush();



file.close();
qDebug()<<"data: size"<<file.size();
socket->disconnectFromHost();

【问题讨论】:

对我来说,我在服务器端和客户端都添加了代码。服务器收到东西后会响应确认,并且客户端可以知道确认。 例如,我通过将数据分成更小的块来发送大量数据。我是否需要为这些块交付中的每一个触发“ACK”机制,还是应该在发送整个包裹时这样做。 【参考方案1】:

TCP 保证有序交付。一旦您将数据提交到 TCP 套接字,堆栈将尝试发送尽可能多的数据。 Stack 使用内部确认消息来保证交付。

所以您不需要发送确认,但是,最好为您的数据包实现一个标头,以便接收方可以正确地将小数据包合并回一个大文件。

【讨论】:

我也想过这个问题,但是我无法达到我一直在谈论的那些块,因为我正在使用 QDataStream。有没有办法到达那些流并将标题放在它们前面? 您可以将多个缓冲区发送到 QDataStream。首先向您发送标题,然后是其余的。第一个词通常是标头的大小和/或协议版本号。

以上是关于QTcpServer- QTcpSocket 确认问题的主要内容,如果未能解决你的问题,请参考以下文章

Qt creator 找不到,QTcpServer 和 QTcpSocket

QTcpSocket 在 QTcpServer::nextPendingConnection() 之后获得 NULL

使用 QTcpSocket 和 QTcpServer 进行控制台聊天

QTcpSocket false 连接到 QTcpServer

Qt基础之三十四:QTcpSocket和QTcpServer源码分析

如何安全地删除 QT::QTcpSocket?