0

TCP サーバーを使用して、QTcpSocket クライアントで接続しようとしています。ほとんどの場合、サーバーとクライアントはたまたま同じマシン上にありますが、これは必須ではありません。私がやろうとしているのは、実行中のマルチスレッド プロセスから、サーバーとクライアントの両方で使用される情報を共有したい GUI にファイルを転送することです。

接続などは問題ないようです。実際、コードは長い間完全に機能しているように見えましたが、別のハードウェアで実行しているため、10.04 ではなく Ubuntu 12.04 で、受信したコードに浮遊バイトが埋め込まれていることがあります。常に) null。何が悪いのかわかりません。アドバイスをいただければ幸いです。

ファイルを読み取り、接続されたクライアントにバイトを送信するサーバーの一部を次に示します。

int fileSize;
                printf(" about to open the file\n");
                ini_fd = fopen (rov_ini_file_name, "r");

                if(!ini_fd){
                    break;
                }
                fseek(ini_fd,0,SEEK_END);
                fileSize = ftell(ini_fd);
                fseek(ini_fd,0,SEEK_SET);
                int totalBytesSent =0;
                int line = 0;
                int len;
                while (!feof (ini_fd))
                    {
                    ch = fgets (&(my_line[0]), MAX_CHARACTER_COUNT - 1, ini_fd);
                    if (ch){
                        len = strlen(&(my_line[0]));
                        bytes_sent = sendto(tio.my_tio_port_table_entry.to_sock, 
                        &(my_line[0]), 
                        len, 
                        0, 
                        (struct sockaddr *) (&(tio.my_tio_port_table_entry.ToAddr)), 
                        sizeof (tio.my_tio_port_table_entry.ToAddr));
                        totalBytesSent += bytes_sent;
                        line++;
                        //printf(" line %d bytes sent = %d total bytes = %d\n",line,bytes_sent,totalBytesSent);
                    }
                }
                len = sprintf(&(my_line[0]),"END_OF_INI_FILE");
                bytes_sent = sendto(tio.my_tio_port_table_entry.to_sock, 
                        &(my_line[0]), 
                        len, 
                        0, 
                        (struct sockaddr *) (&(tio.my_tio_port_table_entry.ToAddr)), 
                        sizeof (tio.my_tio_port_table_entry.ToAddr));

                tio.my_tio_port_table_entry.connected = FALSE;
                break;

ここで、送信されているデータを読み取ります。これは、readyRead 信号に接続されたスロットです。

    void    AlvGUI::readIniFromServer()
{

  QByteArray inArray(iniClient->bytesAvailable(),0);

  if(!iniStarted)
    {
      tempIniFile = new QTemporaryFile;
      if(tempIniFile->open())
        {
          iniStarted = true;
        }
      else
        {
          // error should be here!
        }

    }


  int bytesRead = iniClient->read(inArray.data(),inArray.size());
  int endLoc = inArray.lastIndexOf("END_OF_INI_FILE");
  if(-1 != endLoc)
    {
      inArray.chop(endLoc);
      bytesRead = endLoc;
      iniFinished = true;
    }
  tempIniFile->write(inArray.data(),bytesRead);
  if(iniFinished)
    {
      tempIniFile->flush();
      tempIniFile->close();
      iniFile.close_ini();
      char *theTempFile = strdup((char *)tempIniFile->fileName().toAscii().data());
      iniFile.open_ini(theTempFile);
      gotIni = true;
      iniRequestTimer->stop();
      makeGui();
      free(theTempFile);
      hotelSetup = true;
      iniClient->abort();
    }
}
4

1 に答える 1

0

いつものように、質問をするとさらに深く掘り下げます。tcp サーバーに問題はありませんでした。telnet を使用してサーバーに接続し、出力をファイルにリダイレクトしたことを確認しましたが、問題はありませんでした。

そこで、コードを詳しく調べて、QtByteArray に保持されている受信データを切り捨てる代わりに、QtByteArray の末尾から読み取ったバイト数を切り取っていました。ただし、QtByteArray の data() メンバー関数を使用したときは、char ポインターが返されたので、すべてのデータにアクセスできました。チョップ()を行った場所でデータが破損しました

于 2013-03-28T01:47:00.860 に答える