0

プログラムは .txt ファイルを送信できます。ただし、他のファイルタイプは破損します。フレームを保存するデータ型と関係があると思います。長い投稿で申し訳ありませんが、どこに問題があるのか​​ わかりません。

私はQTだけでなくC ++も初めてです。QUdpSocket を使用して、ネットワーク経由でファイルを別のコンピューターに送信する必要があります。このコンピューターは、データグラムを正しい順序で再構築し、ファイルとして保存する必要があります。(QFile は、シーケンス番号ヘッダーを使用してセグメントに分割し、これらの番号に従って再構築する必要があります)。セグメントは、シーケンス番号とともに QByteArray 配列に格納されます。

//Setup File
filelocation= opendialog->getOpenFileName(this, "Select File to be sent", "C:/Users/<USER>/Desktop");
SentFile.setFileName(filelocation);
if (!(SentFile.open(QIODevice::ReadOnly))){
    return;
}

//Setup Datastream
SentData.setDevice(&SentFile);
SentData.setByteOrder(QDataStream::BigEndian);
SentData.setFloatingPointPrecision(QDataStream::SinglePrecision);
SentData.setVersion(QDataStream::Qt_5_5);

//Calculate number of frames to be sent
max_framesize=200;
int length=SentFile.size();
dsize=length/max_framesize+1;
if((length%max_framesize)!=0)
    dsize++;

//Write initial message with dsize and file name
char BeginMessage[max_framesize+16];
char *cfile= new char[filelocation.length()+1];
strcpy(cfile, filelocation.toStdString().c_str());

sprintf(BeginMessage,"%016d%010d%s",0, dsize-1, cfile);
SendArray[0]= BeginMessage;

int i=1;
while(SentData.atEnd()!=true)
    {

    char s[max_framesize+1];

    int len = SentData.readRawData(s, max_framesize);
    for(int n=len; n<=max_framesize;n++)
    {
        s[n]='\0';
    }
    char tempframe[17];
    sprintf(tempframe,"%016d",i);
    tempframe[16]='\0';

    SendArray[i]=s;
    SendArray[i].prepend(tempframe);
    i++;
    }

次に、QByteArray 配列が qudpsocket 経由で送信されます

void MainWindow::on_pushButton_clicked()
{

for(int l=0; l<dsize; l++)
    {
    QByteArray datagram = SendArray[l];
    socket->writeDatagram(datagram.data(), QHostAddress::Broadcast, 5743);
    }
    ui->lineEdit->clear();
    ui->lineEdit->setFocus();
 }

再構成コードは次のように機能します

void MainWindow::receiveData()
{
while (socket->hasPendingDatagrams())
{
  FramesReceived++;

    QByteArray datagram;

    datagram.resize(socket->pendingDatagramSize());
    QHostAddress sender;
    quint16 senderPort;
    socket->readDatagram(datagram.data(), datagram.size(),
                            &sender, &senderPort);

    char temp[datagram.size()];

    strcpy(temp, datagram);

     char cseq_num[17];
         for(int n=0; n<16;n++)
         {
           cseq_num[n]=temp[n];
         }
         cseq_num[16]='\0';
         datagram.remove(0,16);

     int seq_num = atoi(cseq_num);
     if(seq_num==0)
     {
         char size[11];
             for(int n=0; n<10;n++)
             {
               size[n]=temp[n+16];
             }
             size[11]='\0';
          rsize = atoi(size);

        QByteArray   Name=datagram;
         Name.remove(0, 10);

         strcpy(OriginalName,Name.data());
     }
    ReceivedArray[seq_num]= datagram;
    char message[600];

   sprintf(message,"%d of %d Frames Received\nFile name: %s",FramesReceived,rsize, OriginalName);
ui->label->setText(message);
}
}

すべてのフレームが受信された後

void MainWindow::on_pushButton_3_clicked()
{

filelocation= opendialog->getSaveFileName(this, "Save File");
ReceivedFile.setFileName(filelocation);
if (!(ReceivedFile.open(QIODevice::WriteOnly))){
    return;
}

char snum[27];

    for(int n=0; n<27;n++)
    {
      snum[n]=ReceivedArray[0][n];
    }
    snum[27]='\0';

int len_num = atoi(snum);


ReceivedData.setDevice(&ReceivedFile);
ReceivedData.setByteOrder(QDataStream::BigEndian);
ReceivedData.setFloatingPointPrecision(QDataStream::SinglePrecision);
ReceivedData.setVersion(QDataStream::Qt_5_5);
for(int i=1; i<len_num; i++)
{
ReceivedData.writeRawData(ReceivedArray[i],ReceivedArray[i].length());
}

ReceivedData.writeRawData(ReceivedArray[len_num],ReceivedArray[len_num].length());
ReceivedFile.close();
}
4

0 に答える 0