Пытаюсь передать файл....
C++ (Qt)
if (fileopen.open(QFile::ReadWrite)) {
QByteArray arrayBlock;
QDataStream vivod(&arrayBlock, QIODevice::WriteOnly);
vivod.setVersion(10);
vivod << quint16(0) << quint8('S') << targetFile;
fileopen.seek(0);
[b] while[/b](!fileopen.atEnd()) {
quint64 in;
[b] in = fileopen.read(block, sizeof(block));
vivod.writeRawData(block,in);[/b]
}
vivod.device()->seek(0);
vivod << quint16(arrayBlock.size() - sizeof(quint16));
//записываем данные в сокет
tcpSocket.write(arrayBlock);
}
statusLabel->setText("Sending File...");
}
Код сервера
C++ (Qt)
QDataStream in(this);
in.setVersion(10);
if (nextBlockSize == 0) {
if (bytesAvailable() < sizeof(quint16))
return;
in >> nextBlockSize;
}
if (bytesAvailable() < nextBlockSize)
return;
quint8 requestType;
QString targetFile;
in >> requestType;
if (requestType == 'S') {
in >> targetFile;
generateRandomTrip(targetFile);
QFile target(targetFile);
if(target.open(QIODevice::WriteOnly)){
char block[1024];
//самое основное - пытаюсь считать этот файл из сетевого потока
while(!in.atEnd()) {
quint64 tofile = in.readRawData(block,sizeof(block));
target.write(block,tofile);
...
Получается что обычный *.txt и даже *.dll меньше 60 КБ могу передать, а 1МБ слабо(((((
Я понимаю что это целый протокол, но это не велосипед изобретать!!!в Delphi это всего лишь одна процедура...
Помогите пожалуйста!!!
Автор: Magvaj
Цитата
Среди примеров в книгах есть большой глюк: все после команды записи в сокет закрывают его. Сам с этим сталкивался. Нужно просто следить за сигналами статусов отправки данных и закрывать сокет только после завершения.
А зачем сокет держать открытым??? Передал информацию от клиента к серверу и закрылось соединение, не так ли???
P.S. Я уже целые две недели мудохаюсь, не могу передать нормального размера файл, честное слово...помогите кто может
//Пользуйся тегом КОД для форматирования исходного кода