Посмотрел код, не знаю может так и можно, но учитывая что сокеты используются асинхронные, то в таком же стиле нужно и читать/отправлять данные (так будет надежней), возможно где-то недочитывали данные, либо недосылали.
Переписал в клиенте и сервере эти части, сделал полностью асинхронными. Проверил на файле в 88Мб, после приема сверил контрольные суммы, все сошлось.
Клиент:
C++ (Qt)
void MainWindow::on_pbSendTest1_clicked()
{
QPointer<QFile> sendFile( new QFile(rFName));
if(sendFile->open(QFile::ReadOnly))
{
_sok->setProperty("file", QVariant::fromValue(sendFile));
QDataStream out(_sok);
out << quint16(0xCFCF);
out << qint64(sendFile->size());
_sok->write(sendFile->read(1300));
}
}
void MainWindow::OnbytesWritten(qint64 bytes)
{
QTcpSocket * socket_ = qobject_cast<QTcpSocket*>(sender());
if(!socket_)
return;
QPointer<QFile> sendFile = socket_->property("file").value< QPointer<QFile> >();
if(sendFile.isNull())
return;
if(sendFile->atEnd())
{
sendFile->close();
delete sendFile.data();
_sok->setProperty("file", QVariant());
qDebug("File sended.");
} else {
socket_->write(sendFile->read(bytes));
}
}
Сервер:
C++ (Qt)
void MyThread::readyRead()
{
QTcpSocket * socket_ = socket;
if(!socket_)
return;
QPointer<QFile> receiveFile = socket_->property("file").value< QPointer<QFile> >();
if(receiveFile.isNull())
{
if(socket_->bytesAvailable() >= (sizeof(quint16) + sizeof(qint64)) )
{
QDataStream in(socket_);
quint16 marker_ = 0;
qint64 fileSize_ = 0;
in >> marker_;
in >> fileSize_;
if(marker_ == 0xCFCF)
{
receiveFile = new QFile(wFName);
receiveFile->open(QFile::WriteOnly);
socket_->setProperty("file", QVariant::fromValue(receiveFile));
socket_->setProperty("remaining_size", QVariant::fromValue(fileSize_));
qDebug() << "Start file receiving. Size = " << fileSize_;
}
} else {
return;
}
}
if(receiveFile)
{
qint64 remainingSize = socket_->property("remaining_size").value<qint64>();
while(!socket_->atEnd() && remainingSize > 0)
{
if(remainingSize > socket_->bytesAvailable())
{
remainingSize -= receiveFile->write(socket_->readAll());
qDebug() << "Remaining size = " << remainingSize;
} else {
remainingSize -= receiveFile->write(socket_->read(remainingSize));
qDebug() << "File received.";
receiveFile->close();
delete receiveFile.data();
socket_->setProperty("file", QVariant());
break;
}
}
socket_->setProperty("remaining_size", QVariant::fromValue(remainingSize));
}
}
Исправленную версию с комментариями прикладываю.