3

我对此有点困惑,并且没有很多文件传输经验,所以希望我只是在做一些愚蠢的事情。

反正。问题。我正在将一个文件从我的客户端分块发送到我的服务器。这工作正常。在发送期间,我的客户正在定期等待进度消息,所以我知道已经发送了多少数据。但是,当我发送任何进度消息时,服务器端的文件传输超时。

我很确定这不是客户端代码的问题,所以我会忽略它。我已经评论了在 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();
}
4

0 回答 0