Russian Qt Forum
Ноябрь 23, 2024, 22:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: прием файлов по tcp  (Прочитано 7131 раз)
PB
Гость
« : Июль 23, 2011, 00:31 »

доброго времени суток.
стоит задача, написать программу для передачу файлов по сети. программа свёрнута в трей, и одновременно является как клиентом, так и сервером.
подвис на части с передачей файла. общий алгоритм - открываем файл для чтения, поблочно копируем.
если есть у кого соображения или идеи, высказывайте, это может хорошенько помочь.
вот сам проект http://rghost.ru/15476971
так же интересует одровременное существование окон клиента и сервера. потому что на данном этапе программа устроенна как клиент.
с библиотекой Qt работать начал недавно, информации на эту тему маловато можно почерпнуть из книг.
Записан
merke
Гость
« Ответ #1 : Июль 23, 2011, 06:46 »

Как из вариантов, видел здесь на форуме:

передача:

Код
C++ (Qt)
 while(curNumber*_blockSize<=_FileSize)
   {
       qint64 a=_FileSize-curNumber*_blockSize;
       int blockSize = qMin(a,_blockSize);
       QByteArray filearr=FileForSend->read(blockSize);
           sock->write(filearr);
           curNumber++;
   }


прием:

Код
C++ (Qt)
quint64 currentSize=0,curBytesAv=0;
   while(currentSize < FileSize){
       curBytesAv=socket->bytesAvailable();
       if(curBytesAv>0){
           QByteArray arr;
           arr = sock->read(curBytesAv);
           if(curBytesAv==arr.size()){
               FileForRec->write(arr);
               currentSize+=curBytesAv;
               }
           }
       if(currentSize < FileSize)
           sock->waitForReadyRead();
   }
Записан
TukiNov
Гость
« Ответ #2 : Июль 23, 2011, 08:55 »

Писал я такой клиент-сервер. Мои советы:
1. Делай сразу и сервер и клиент многопоточными
2. Перед передачей файла отправляй что ты будешь передавать, ну например имя файла,размер файла
3. У меня в конце передачи файла сделано следующие, я сверяю контрольные суммы, и если совпадают сообщаю об успешной отправке/приеме и разрываю соединение
Записан
brankovic
Гость
« Ответ #3 : Июль 23, 2011, 10:13 »

я сверяю контрольные суммы, и если совпадают сообщаю об успешной отправке/приеме и разрываю соединение

а что, бывает не совпадают при передаче по tcp?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Июль 23, 2011, 15:19 »

1. TC, почитай про модель ISO/OSI.
2. Почитай спецификацию на любой из протоколов для передачи файлов: X-modem (и аналогичные), FTP и т.п.

И поймешь, что то что ты делаешь - это полная х#$ь.

ЗЫ: И почему бы не использовать QFtp ?
Записан

ArchLinux x86_64 / Win10 64 bit
PB
Гость
« Ответ #5 : Июль 24, 2011, 19:04 »

Вот еще пара вопросов. Как определить список доступных компьютеров в локальной сети? Есть код, но он определяет только собственный хост:
Код:
QString ipAddress;
    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
for (int i = 0; i < ipAddressesList.size(); ++i)
{
         if (ipAddressesList.at(i) != QHostAddress::LocalHost &&
             ipAddressesList.at(i).toIPv4Address())
{
             ipAddress = ipAddressesList.at(i).toString();
ui.hosts->addItem(ipAddress);         
}
}


И еще. В метод connectToHost() мы передаем адрес хоста и порт. Откуда взять порт?
Записан
Orfus
Гость
« Ответ #6 : Июль 25, 2011, 10:01 »

...
И поймешь, что то что ты делаешь - это полная х#$ь.
ЗЫ: И почему бы не использовать QFtp ?
А если у человека уже есть готовое соединение для каких то своих нужд( чат какой или управление клиентским приложением) и он хочет через него организовать передачу, зачем ему открывать ещё один порт? Или QFtp позволяет передавать по уже открытому и используемому?  Непонимающий

Вот еще пара вопросов. Как определить список доступных компьютеров в локальной сети?
1) Широковещательные рассылки (QUdpSocket и погнал)
2) Пинговать (изврат)
 
...
 В метод connectToHost() мы передаем адрес хоста и порт. Откуда взять порт?

Стучись по всем портам или храни порт по умолчанию. Можешь ip и порт в широковещательной передавать. В 99% программах связанных с сетью видел окно настроек с возможностью указать порт.
« Последнее редактирование: Июль 25, 2011, 11:09 от Orfus » Записан
PB
Гость
« Ответ #7 : Июль 28, 2011, 15:17 »

Написал код передачи. Почему то после 33 килобайт останавливается waitForBytesWritten. Может кто знает в чем проблема? Вот код:
Код:
void FTClient::sendPartOfFile() 
{
    sendFile->open(QFile::ReadOnly);
    QDataStream read(sendFile);
long int  lBytes = 0;
    char * ch;
    ch = (char*)malloc(sizeof(char) * 1024);
    //ch[1023] = '\0';
    while(!read.atEnd()){
      int l = read.readRawData(ch, sizeof(char)*1024);
      QByteArray ba(ch, sizeof(char)*l);

      lBytes += m_tcpSocket->write(ba, sizeof(char)*l);
  bool is = m_tcpSocket->waitForBytesWritten();
      m_tcpSocket->flush();
      if (-1 == lBytes){
        qWarning() << "Error";
        m_tcpSocket->close(); //Закрываем устройство сокета
        return;
      }
     /* float procentage = ((float)lBytes / package.filelength) * 100;
      emit setProcentage((int)procentage);*/
    }//while(!readEnd())
    free((void*)ch);
closeConnection();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.085 секунд. Запросов: 22.