QTcpSocket bytesAvailable()= 0

时间:2017-10-20 09:59:03

标签: qt sockets

此插槽必须将消息放入套接字的缓冲区,但不发送信号readyRead()。 我发现写入数据的大小与数组大小相同,但方法bytesAvailable()始终返回零。 无法理解为什么会发生

代码:

void Client::slotMessageSend()
{
  QByteArray array;
  QDataStream str(&array, QIODevice::WriteOnly);
  str.setVersion(QDataStream::Qt_4_5);
  str << quint16(0) << QTime::currentTime() << ui->textMessage->toPlainText() ;

  str.device()->seek(0);
  str << quint16(array.size() - sizeof(quint16));
  cout << pClientSocket->write(array) << endl;
  cout << array.size()<< "   " << pClientSocket->bytesAvailable() << endl;

  ui->textMessage->setPlainText("");

}

1 个答案:

答案 0 :(得分:0)

当新数据准备好读取时,将发出

QTcpSocket::readyRead。在这种情况下,QTcpSocket::bytesAvailable返回可用数据的大小。如果没有数据发送到该套接字,它将始终返回0。

调用该函数主要仅在对readyRead信号作出反应的插槽中有意义。

如果您打算在写入套接字后读取已发回的数据 - 因为客户端始终响应写入 - 可能是没有可用数据,或者另一方从未发回任何数据。

您可以尝试以下操作:

pClientSocket->write(...)
if (pClientSocket->waitForReadyRead(...)) {
    // yes there is data available
    // pClientSocket->bytesAvailable() > 0
}

示例如何以更好的方式做到:

Client::Client() {
    connect(pClientSocket, &QTcpSocket::readyRead, this, &Client::HandleRead);
    connect(pClientSocket, &QTcpSocket::bytesWritten, this, &Client::HandleWrite);
}

Client::SendSomeData(const QByteArray& Data) {
    pClientSocket->write(Data);
}

Client::HandleWrite(qint64 Size) {
    // Size bytes are written to socket buffer...
}

Client::HandleRead() {
    // pClientSocket->bytesAvailable() are available in socket buffer...
}