0

ある PC から別の PC にファイルを送信するプログラムを作成しています。を使用して送信しようとしていますchar* bufferが、問題が発生しています。バッファを送信すると思いますが、結果はサイズが0キロバイトのファイルです。バッファをファイルに書き込んでいないのではないかと思いますが、確かなことはわかりません。私のバッファ データは *bmp ファイルからのものです。ここでほぼ同じことについて別の質問を見つけましたが、もっと説明が必要です。

私は C++ Builder 2010 を使用していますが、そのチュートリアルを見つけるのは困難です。便利なさまざまなコンポーネントと機能があります。

コード:


クライアント:

void __fastcall TForm1::TcpServer1Accept(TObject *Sender,
    TCustomIpClient *ClientSocket)
{
  char *buffer;
  TcpServer1->ReceiveBuf(buffer, sizeof(buffer), 0);

  CreateFile(buffer); //function that creates a file from the buffer

  //Drawing my bmp on the form
  Slide->LoadFromFile("ScreenShotBorland.bmp");
  Image1->Canvas->Draw(0, 0, Slide);

  free(buffer);
}

void CreateFile(char *buffer)
{

  FILE *fp = NULL;

  fp = fopen("teste.bmp", "wb");
  if (fp == NULL) {
    MessageBox(NULL, "ERRO!", "Error", MB_OK | MB_ICONERROR);
  }

  fwrite(buffer, 1, sizeof(buffer), fp);
  free(buffer);
  fclose(fp);
}

サーバー:

void __fastcall TForm1::TcpClient1Connect(TObject *Sender)
{
  //Open a file to load the buffer
  long lSize;
  char *buffer;
  size_t result;
  FILE *pf2 = fopen("teste.bmp", "rb");

  if (pf2 == NULL) {
    MessageBox(NULL, "ERRO!", "Error", MB_OK | MB_ICONERROR);
  }

  fseek(pf2, 0, SEEK_END);
  lSize = ftell(pf2);
  rewind(pf2);

  //allocate the buffer in memorie
  buffer = (char*) malloc(sizeof(char) * lSize);
  if (buffer == NULL)
    MessageBox(NULL, "ERRO!", "Error", MB_OK | MB_ICONERROR);

  result = fread(buffer, 1, lSize, pf2);

  if (result != lSize)
    MessageBox(NULL, "ERRO!!!", "Error", MB_OK | MB_ICONERROR);

  //Transferring the file
  if (TcpClient1->Active)
    TcpClient1->SendBuf(buffer, sizeof(buffer), 0);

  free(buffer);
  fclose(pf2);
}
4

1 に答える 1

0
  • クライアントは TTcpServer を使用し、サーバーは TTcpClient を使用します。これは紛らわしく、間違っている可能性があります (用語が間違っているか、コードが間違っています)。
  • およびBufSizeへのパラメーターについて、コードは を送信します。 は(へのポインター) であり、ポインターのサイズは x86 では 32 ビットです。 変数が指すものではなく、変数自体のサイズを示します。C と C++ は、変数が指すもののサイズさえ知りません。初期化されていないか、NULL である可能性があるためです。または、他の場所にある別のバッファーへのエイリアスである可能性もあります。SendBufReceiveBufsizeof(buffer)bufferchar *charsizeofbuffer
  • 「クライアント」コード (バッファーを受信するコード) には、期待するデータのサイズを処理する方法がありません。これを修正するには、コンテンツを送信する前にサイズを送信する必要があります。CreateFile関数はそのサイズをパラメータとして受け取る必要があることに注意してくださいbuffer
  • 「クライアント」コード (バッファーを受信するコード) は、バッファーにスペースを割り当てません。
  • 提案:CreateFileWindows API 関数です。アプリケーション固有の関数に一般的な Windows API 関数と同じ名前を付けないようにすると、コードが読みやすくなります。 CreateScreenshotFileまたはSaveScreenshotおそらくより良いでしょう。
于 2009-11-09T16:49:50.800 に答える