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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача файла по UDP  (Прочитано 4564 раз)
winneru
Гость
« : Январь 08, 2010, 11:17 »

Здравствуйте.У меня такая проблема - написал программу для передачи файла по udp.Все работает только вот размер файла не должен превышать приблизительно 100КВ,иначе не отправляет.Я подумал над этим и сделал предварительное разбиение файла на кусочки по 40КВ.Но при этом принимается только 80КВ,так так следующий кусочек уже превысит 100КВ.Вобщем каким образом не разбивай,а лимит в 100КВ он превышать не хочет.Подскажите пожалуйста,может быть надо просто очищать какой-либо буфер приема или может быть изменить параметры порта.Или может предложите другое решение.Буду очень признателен

Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Январь 08, 2010, 11:24 »

Может нужно попробовать после qint64 QIODevice::write ( const QByteArray & byteArray ) делать bool QAbstractSocket::flush () ?
Записан

ArchLinux x86_64 / Win10 64 bit
winneru
Гость
« Ответ #2 : Январь 08, 2010, 11:35 »

Спасибо большое,но все равно бестолку.Я уже пробовал flush и для отправляющего сокета и для принимающего,но все равно нет
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Январь 08, 2010, 11:59 »

Проект в студию
Записан

ArchLinux x86_64 / Win10 64 bit
winneru
Гость
« Ответ #4 : Январь 08, 2010, 12:15 »

Вот разбиение и отправка

Код:
QByteArray dat_tmp;
   QByteArray datf;
  
  
   dat_tmp.append(fil_out.readAll());  
  
   if(dat_tmp.size() < 10000)
   {datf.append(dat_tmp);
      datf.append("`");
   datf.append(nam_file);
   socket_out->writeDatagram(datf, con_host.getIP(send_to->currentText()), 1012);
   }

   else
  
   {
   for(int i=0;i<dat_tmp.size();i++)
   { datf.append(dat_tmp.at(i));

      if(i == k)
      {  
      datf.append("`");
   datf.append(nam_file);
   socket_out->writeDatagram(datf, con_host.getIP(send_to->currentText()), 1012);
  
        k += 47 * 1024;
        datf.clear();
      continue;
          }
      }
      
   }  
  
   k = 45 * 1024;
   QMessageBox::warning(this, tr("Файл послан"), tr("Файл послан"), QMessageBox::Ok, 0);
  
  
   };


А вот прием


void Send_file_main::inbox_file()
   {
      QByteArray dat;
      QByteArray res;
   QHostAddress* ha=new QHostAddress;
   quint16* port=new quint16;
  
   do
   {        
      dat.resize(socket_in->pendingDatagramSize());
      socket_in->readDatagram(dat.data(), dat.size(), ha, port);
       res.append(dat);
      dat.clear();
      
      
   }while(socket_in->hasPendingDatagrams());
  
   QList<QByteArray> lba = res.split('`');

   QString nam_file;
   nam_file = lba.takeLast();
   QByteArray mess;
  
   while(!lba.isEmpty()) mess.append(lba.takeFirst());

   QString nf("C:/KSI/files/in_files/"+nam_file);

   res.resize(res.size()-nam_file.size()-1);

   QFile newfil(nf);
   newfil.open(QIODevice::WriteOnly);
  
   newfil.write(res);

   QMessageBox::warning(0, tr("ВНИМАНИЕ"), tr("Пришел файл!"), QMessageBox::Ok);


   };

Пользуйтесь тегом code. [Dendy]
« Последнее редактирование: Январь 08, 2010, 12:33 от Dendy » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Январь 08, 2010, 13:55 »

Из ассистента:
Цитировать
Sends the datagram at data of size size to the host address address at port port. Returns the number of bytes sent on success; otherwise returns -1.

Datagrams are always written as one block. The maximum size of a datagram is highly platform-dependent, but can be as low as 8192 bytes. If the datagram is too large, this function will return -1 and error() will return DatagramTooLargeError.

Sending datagrams larger than 512 bytes is in general disadvised, as even if they are sent successfully, they are likely to be fragmented by the IP layer before arriving at their final destination.

Warning: Calling this function on a connected UDP socket may result in an error and no packet being sent. If you are using a connected socket, use write() to send datagrams.

т.е. по ходу нужно использовать просто метод: qint64 QIODevice::write ( const QByteArray & byteArray )

а вообще, смотрите примеры из:
...\examples\network\broadcastreceiver\
...\examples\network\broadcastsender\
« Последнее редактирование: Январь 08, 2010, 14:01 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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