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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Передача файлов по сети  (Прочитано 27561 раз)
winneru
Гость
« : Октябрь 11, 2009, 21:47 »

Помогите, пожалуйста. Необходимо организовать передачу файла через сеть, используя в качестве адреса получателя его IP адрес. Как сделать это с помощью UDP? Или может быть есть другой способ? Заранее спасибо
Записан
registrationfedser87
Гость
« Ответ #1 : Октябрь 12, 2009, 09:36 »

Передачу файлов лучше наверно по протоколу TCP делать. Посмотри QTcpServer,QTcpSocket, а также пример Loopback Example.
Записан
winneru
Гость
« Ответ #2 : Октябрь 12, 2009, 10:01 »

большое спасибо.а может быть как то через udp можно?Я читал что с помощью udp организуется даже предача потокового видео по сети.Наверное и файл передать можно
Записан
registrationfedser87
Гость
« Ответ #3 : Октябрь 12, 2009, 10:25 »

передать то и по UDP можно,но UDP(в отличии от TCP) не гарантирует доставку пакета, т.е. проверку доставлен ли каждый пакет до получателя или нет придётся проводить самому.
« Последнее редактирование: Октябрь 12, 2009, 11:02 от fedser87 » Записан
winneru
Гость
« Ответ #4 : Октябрь 12, 2009, 12:01 »

Насчет небезопасности и ненадежности я в курсе.Это не важно.Так может ты все таки знаешь как передачу через udp организовать?Надо считать файл в поток?Подскажи пожалуйста в каком хотя бы направлении двигаться.Буду очень признателен
Записан
registrationfedser87
Гость
« Ответ #5 : Октябрь 12, 2009, 12:17 »

А что у тебя не получается? Скажу сразу я файл через UDP не передавал.  Ты можешь разбить файл на куски и передать их пакетами. На принимающей стороне получать эти пакеты и собирать их в один файл (быть может надо передавать ещё номер части файла). После того как передана последняя часть отсылаешь какой-нибудь информирующий пакет клиенту что передача завершена
Записан
winneru
Гость
« Ответ #6 : Октябрь 12, 2009, 12:26 »

Вот я и хотел узнать каким образом произвести разбиение на пакеты.Я без труда разобрался как с помощью writeDatagram() посылать текстовые сообщения.Просто объявлять эти сообщения через QByteArray.А вот как засунуть вместо текста файл?
Записан
TukiNov
Гость
« Ответ #7 : Октябрь 12, 2009, 12:43 »

сам щас пишу клиент сервер.
вот как я читаю файл и отправляю паки
Код:
    file.open(QFile::ReadOnly);
    QDataStream read(&file);
    lBytes = 0;
    char * ch;
    ch = (char*)malloc(sizeof(char) * 1024);
    ch[1023] = '\0';
    while(!read.atEnd()){
      int l = read.readRawData(ch, sizeof(char)*1023);
      QByteArray ba(ch, sizeof(char)*l);

      lBytes += m_pTcpSocket->write(ba, sizeof(char)*l);
      m_pTcpSocket->flush();
      if (-1 == lBytes){
        qWarning() << "Error";
        m_pTcpSocket->close(); //Закрываем устройство сокета
        return;
      }
      float procentage = ((float)lBytes / package.filelength) * 100;
      emit setProcentage((int)procentage);
    }//while(!readEnd())
    free((void*)ch);
Записан
winneru
Гость
« Ответ #8 : Октябрь 12, 2009, 12:51 »

Большое спасибо.Я просто методы не те использовал.И этот код уже рабочий,разбивает и отправляет?
Записан
TukiNov
Гость
« Ответ #9 : Октябрь 12, 2009, 12:53 »

Большое спасибо.Я просто методы не те использовал.И этот код уже рабочий,разбивает и отправляет?
ну да. 100% рабочий. Его и использую. отправляет пакеты по 1024. Моно и больше сделать.
Записан
winneru
Гость
« Ответ #10 : Октябрь 12, 2009, 12:56 »

Бесконечно благодарен.А насчет udp не знаешь?
Записан
TukiNov
Гость
« Ответ #11 : Октябрь 12, 2009, 12:59 »

Бесконечно благодарен.А насчет udp не знаешь?
я не писал под UDP, но каж там все также как и с TCP. Поменяй QTcpSocket * m_pTcpSocket на QUdpSocket и все. Глянь ассистент по поводу отправки пакетов по UDP Улыбающийся
Записан
winneru
Гость
« Ответ #12 : Октябрь 12, 2009, 13:07 »

А вот ты написал мне код для разбиения и отправки, а для принятия их на клиете тоже отдельный код нужен или он будет сам в текущую папку сохранять?
Записан
TukiNov
Гость
« Ответ #13 : Октябрь 12, 2009, 13:15 »

А вот ты написал мне код для разбиения и отправки, а для принятия их на клиете тоже отдельный код нужен или он будет сам в текущую папку сохранять?
Канеш нуно писать прием Улыбающийся Я свой протокол реализовывал, сначала слал пакет с описанием, ну например, размер фала, имя файла, а потом уже начинал отправку.
на стороне сервера прием:
Код:
  QFile save(package.filename);
  save.open(QFile::WriteOnly);
  QDataStream write(&save);

  long int lBytesDone = 0; //Пока ничего не приняли
  long int lSize = package.filelength;
  long int lBytes;
  while (lBytesDone < lSize){//Пока приняли меньше, чем указано
    //Ожидаем данные
    lBytes = 0;
    while (lBytes == 0) lBytes = m_pTcpSocket->waitForReadyRead(-1);
    if (-1 == lBytes){//Если произошла ошибка сокета, то
      qWarning("-----TFileServer: Aborting download.");
      m_pTcpSocket->close();
      return;
    }//if (-1 == lBytes)
    QByteArray tmp = m_pTcpSocket->readAll();
    lBytes += write.writeRawData(tmp.data(), tmp.size());
    lBytesDone += tmp.size();
    float procentage = ((float)lBytes / package.filelength) * 100;
    emit setProcentage((int)procentage);
  }//while (lBytesDone < lSize)
  save.close();
Записан
BRE
Гость
« Ответ #14 : Октябрь 12, 2009, 13:26 »

2 TukiNov
Несколько вопросов/комментариев.  Улыбающийся
* Почему malloc, а не new?
* Для чего нужен QDataStream? У QFile есть свой метод read, который читает нужное количество байт и возвращает готовый QByteArray (malloc/free не понадобятся).
* У QTcpSocket есть метод write, который в качестве параметра получает QByteArray.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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