Tengo dos aplicaciones QT. Se puede considerar que una aplicación contiene un gran dato y envía aproximadamente 10 KB de fragmento de datos por segundo a segunda aplicación.QTcpSocket no envía datos a veces
Anteriormente traté de usar QUdpSocket para transmitir los datos, pero debido a la limitación de MTU de aproximadamente 2-5K y necesito dividir y reunir los datos, cambié a QTcpSocket.
A veces los datos se envían correctamente con QTcpSocket (especialmente si escribo datos con mucha frecuencia ~ cada 100 ms) pero a veces los datos no se envían en absoluto. Ni siquiera después de 5 seg. Y, a veces, varios fragmentos de datos se almacenan en el búfer interno durante un largo período (varios segundos) y luego se envían juntos.
m_socket = new QTcpSocket(this);
m_socket->connectToHost(QHostAddress::LocalHost, 45454);
sendDataEverySec()
{
QByteArray datagram(10000, 'a');
qint64 len = m_socket->write(datagram);
if(len != datagram.size())
qDebug() << "Error"; //this NEVER occurs in MY case.
m_socket->flush();
}
En el lado receptor, utilizo readyRead
señal para saber cuándo ha llegado datos.
¿Cómo puedo garantizar que los datos se envíen inmediatamente? ¿Hay alguna alternativa mejor para lo que estoy tratando de hacer?
Editar :: Cuando escribo después de largas brechas de 1 segundo, recibo "QAbstractSocket::SocketTimeoutError"
en el lado del receptor cada vez que el remitente envía datos. Este error no se recibe si el remitente escribe datos con frecuencia.
¿Está bien utilizar QTcpSocket para transmitir datos de la manera en que lo estoy haciendo?
Edición 2: En el lado del receptor, cuando se emite la señal readyRead
, nuevamente estaba revisando while(m_socket->waitForReadyRead(500))
y estaba obteniendo "QAbstractSocket::SocketTimeoutError"
debido a esto. Además, este control impedía la entrega de trozos individuales.
Después de revisar más documentos, parece que readyRead
se emitirá continuamente cuando haya nuevos datos disponibles, por lo que no es necesario waitForReadyRead
.
Recibo todos los datos enviados, pero aún así los datos no se reciben de inmediato. A veces se combinan dos o tres fragmentos. Esto puede deberse a un retraso en el lado del receptor al leer datos, etc.
¿Puedes intentar configurar el indicador QAbstractSocket :: LowDelayOption para setSocketOption API? – Kunal
@Kunal, probé LowDelayOption y KeepAliveOption sin ningún éxito.Curiosamente, tan pronto como el remitente envía datos, el receptor muestra un "QAbstractSocket :: SocketTimeoutError". Esto sucede al escribir datos en espacios de 1 segundo. –
Estoy convencido de que el problema está en el lado receptor. Por favor, muéstranos cómo manejas las conexiones entrantes. – Koying