Russian Qt Forum

Qt => Работа с сетью => Тема начата: winneru от Январь 08, 2010, 11:17



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



Название: Re: Передача файла по UDP
Отправлено: kuzulis от Январь 08, 2010, 11:24
Может нужно попробовать после qint64 QIODevice::write ( const QByteArray & byteArray ) делать bool QAbstractSocket::flush () ?


Название: Re: Передача файла по UDP
Отправлено: winneru от Январь 08, 2010, 11:35
Спасибо большое,но все равно бестолку.Я уже пробовал flush и для отправляющего сокета и для принимающего,но все равно нет


Название: Re: Передача файла по UDP
Отправлено: kuzulis от Январь 08, 2010, 11:59
Проект в студию


Название: Re: Передача файла по UDP
Отправлено: winneru от Январь 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]


Название: Re: Передача файла по UDP
Отправлено: kuzulis от Январь 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\