Пытаюсь реализовать в моей программе передачу данных. Уже 3 дня сижу не пойму в чем проблема. На одном компьютере запущен tcp server, на другом tcp socket который подключается к серверу и отправляет информацию: длину названия директории, название директории, длину файла, сам файл. Какое-то время работала передача мелкий файлов, теперь отправляет только 1 байт.
это клиент который отправляет файл
QString fname = QFileDialog::getOpenFileName(this, tr("Выберите файл"));
QString destfname = QInputDialog::getText(this, "Выбор удалённой директории","Введите путь:");
QFile file(fname);
file.open(QIODevice::ReadOnly);
qDebug() << "start reading file";
QByteArray dataarr = file.readAll();
qDebug() << "file read end. read bytes:" << dataarr.size();
QTcpSocket *tsoc = new QTcpSocket(this);
QByteArray sendarr;
connect(tsoc, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(haner(QAbstractSocket::SocketError)));
qDebug() << "connecting to host...";
tsoc->connectToHost((QHostAddress)ui->listWidget->item(i)->text(), 16666);
if(tsoc->waitForConnected(3000))
qDebug() << "connected to host!";
else
{
qDebug() <<"can't connect to host!";
continue;
}
sendarr.clear();
sendarr.push_back(destfname.size());
qDebug() << "sending fname size...";
tsoc->write(sendarr);
tsoc->waitForBytesWritten();
sendarr.clear();
sendarr = destfname.toUtf8();
qDebug() << "sending fname...";
tsoc->write(sendarr);
tsoc->waitForBytesWritten();
sendarr.clear();
sendarr.push_back(dataarr.size()/256/256/256);
sendarr.push_back(dataarr.size()/256/256%256);
sendarr.push_back(dataarr.size()/256%256);
sendarr.push_back(dataarr.size()%256);
qDebug() << "sending data size...";
tsoc->write(sendarr);
tsoc->waitForBytesWritten();
qDebug() << "writing file: " << tsoc->write(dataarr) << "bytes";
tsoc->waitForBytesWritten();
if(tsoc->waitForDisconnected(-1))
qDebug() << "disconnected!";
tsoc->close();
это сервер, принимает файл
QTcpServer *listener = new QTcpServer(this);
connect(listener, SIGNAL(acceptError(QAbstractSocket::SocketError)), this, SLOT(erhandle(QAbstractSocket::SocketError)));
listener->listen(QHostAddress::AnyIPv4, 16666);
listener->waitForNewConnection(5000);
QTcpSocket* tsoc;
if(listener->hasPendingConnections())
{
tsoc = listener->nextPendingConnection();
connect(tsoc, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erhandle(QAbstractSocket::SocketError)));
}
else
{
qDebug() << "no connections!";
break;
}
tsoc->waitForReadyRead(-1);
QByteArray inarr;
qint8 fnamesize;
qDebug() << "reading filename length";
while(1)
if(tsoc->bytesAvailable() >= 1)
{
qDebug() << tsoc->bytesAvailable();
inarr = tsoc->read(1);
break;
}
else
qDebug() << tsoc->bytesAvailable();
fnamesize = (qint8)inarr[0];
inarr.clear();
QByteArray fname;
fname.resize(fnamesize);
qDebug() << "filename size" << fnamesize;
if(tsoc->bytesAvailable() == 0)
{
qDebug() << "only 1 byte recieved";
tsoc->close();
break;
}
qDebug() << "reading filename";
while(1)
if(tsoc->bytesAvailable() >= fnamesize)
{
qDebug() << tsoc->bytesAvailable();
fname = tsoc->read(fnamesize);
break;
}
else
qDebug() << tsoc->bytesAvailable();
inarr.clear();
qDebug() << "filename" << fname;
qDebug() << "reading data length";
while(1)
if(tsoc->bytesAvailable() >= 4)
{
qDebug() << tsoc->bytesAvailable();
inarr = tsoc->read(4);
break;
}
else
qDebug() << tsoc->bytesAvailable();
qint32 datasize = (quint8)inarr[0]*256*256*256 + (quint8)inarr[1]*256*256 + (quint8)inarr[2]*256 + (quint8)inarr[3];
qDebug() << "data size" << datasize;
qDebug() << "reading data";
int tempsize = datasize;
QByteArray data;
qDebug() << "wiiting for data";
while(1)
{
if(tempsize <= 0)
break;
qDebug() << tsoc->bytesAvailable();
QByteArray tempdata = tsoc->readAll();
data.append(tempdata);
tempsize -= tempdata.size();
}
QFile file(fname);
file.open(QIODevice::WriteOnly);
file.write(data);
file.close();
tsoc->close();
listener->close();