Проблема двусторонней передачи файлов 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();
}

0 ответов

Другие вопросы по тегам