2017-10-20 30 views
0

Cet emplacement doit placer des messages dans le tampon d'un socket, mais le signal readyRead() n'est pas envoyé. J'ai découvert que la taille des données écrites est la même que la taille du tableau, mais la méthode bytesAvailable() renvoie toujours zéro. ne comprends pas pourquoi il arriveQTcpSocket bytesAvailable() = 0

code:

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(""); 

}

+0

Avez-vous vu les exemples de socket Qt? Ça a l'air un peu bizarre, qu'est-ce que tu essayes de faire avec ce code? Habituellement, vous écrivez sur une socket et le récepteur (c'est-à-dire un serveur de socket) peut renvoyer quelque chose et vous pouvez alors lire les données et avoir des octets disponibles et 'bytesAvailable()' sera '> 0'. – xander

+0

Je veux écrire des données sur un socket et lire ces données sur mon client et mon serveur –

Répondre

0

QTcpSocket::readyRead sera émis lorsque de nouvelles données est prêt pour la lecture. Dans ce cas, QTcpSocket::bytesAvailable renvoie la taille des données disponibles. Il retournera toujours 0 si aucune donnée n'a été envoyée à cette socket.

L'appel de cette fonction n'a de sens que dans l'emplacement qui réagit sur le signal readyRead. Si votre intention est de lire les données qui ont été renvoyées après que vous avez écrit dans le socket - parce que le côté client répond toujours à une écriture - il peut être soit qu'il n'y a pas encore de données disponibles, ou que l'autre côté n'a jamais envoyé de données.

Vous pouvez essayer ce qui suit:

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

Exemple comment faire la meilleure façon:

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... 
} 
+0

J'ai ajouté le code que vous avez écrit et le socket n'émet pas encore readyRead() –

+0

J'ai oublié de mentionner, le signal readyRead peut ne pas être émis si vous appelez il d'une de vos méthodes de fente. Mettez-le dans le quelque part à l'extérieur. – bkausbk

+0

Je ne comprends tout simplement pas pourquoi le signal n'a pas été émis si j'ai écrit des données dans le socket –