Проблема двусторонней передачи файлов QTcpSocket

Я немного озадачен этим и не имею большого опыта в передаче файлов, так что, надеюсь, я просто делаю что-то глупое.

Тем не мение. Эта проблема. Я отправляю файл частями от моего клиента на мой сервер. Это отлично работает. Во время отправки мой клиент периодически ожидает сообщения о прогрессе, поэтому я знаю, сколько данных было отправлено. Однако когда я отправляю какие-либо сообщения о прогрессе, время передачи файла на стороне сервера истекает.

Я уверен, что это не проблема с кодом на стороне клиента, поэтому я опущу это. Я прокомментировал две строки, которые, кажется, убивают вещи в методе sendFeedback (). С двумя закомментированными строками waitforReadyRead () почти сразу же отключится в основном цикле. Это почти то же самое, что запись в сокет блокирует любую информацию, которая была на сокете, от чтения и останавливает чтение любых дальнейших данных.

Такое ощущение, что я что-то упускаю с сокетами при отправке и получении «одновременно», но я ничего не могу найти в документации.

Любые идеи очень приветствуются.

Код получения файла:

const int Timeout = 30 * 1000;
QTcpSocket tcpSocket;

if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocket.error());
return;
}

while(totalBytesRead<blockSize && !error && !success)
{

int toRead = blah blah blah
//loop until chosen chunk amount is available on socket
while (tcpSocket.bytesAvailable() < toRead)
{
//if no reply from socket, exit
if (!tcpSocket.waitForReadyRead(Timeout))
{
error=true;
break;
}
}
//read data
int actuallyRead = in.readRawData(datas, toRead);
//if data read
if(actuallyRead)
{
sendFeedback(&tcpSocket, actuallyRead);
//write the chunk to disk
out.writeRawData(datas,actuallyRead);
if(totalBytesRead == blockSize)
{
success = true;
break;
}
}
}

Это моя функция обратной связи:

void FileServerThread::sendFeedback(QTcpSocket* tcpSocket, int bytesActuallyRead)
{
//send some progress back to the client
QByteArray bytesReadArray;
QDataStream out(&bytesReadArray, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << bytesActuallyRead;

//feedback requires this but fails with these 2 lines
//tcpSocket->write(bytesReadArray);
//tcpSocket->waitForBytesWritten();
}

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]