如何传输缓冲区? TTCpServer / TTcpClient

时间:2009-11-06 02:27:10

标签: c++builder-2010 ttcpserver

我正在编写一个程序,用于将文件从一台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);
}

1 个答案:

答案 0 :(得分:0)

  • 您的客户端使用TTcpServer,您的服务器使用TTcpClient。这是令人困惑的,可能不正确(术语不正确或代码不正确)。
  • 对于BufSizeSendBuf的{​​{1}}参数,您的代码会发送ReceiveBufsizeof(buffer)buffer(指向char *的指针),指针的大小在x86上是32位。 char告诉变量本身的大小,而不是变量指向的大小。 C和C ++甚至不知道变量所指向的大小,因为sizeof可能是未初始化的,或者是NULL,或者它可能只是别处其他缓冲区的别名,依此类推。
  • “客户端”代码(接收缓冲区的代码)无法实现预期的数据大小。要解决此问题,您应该在发送内容之前发送大小。请注意,您的buffer函数需要将该大小作为参数,以便知道CreateFile的大小。
  • “客户端”代码(接收缓冲区的代码)永远不会为缓冲区分配空间。
  • 建议:bufferWindows API function。如果避免为特定于应用程序的函数提供与通用Windows API函数相同的名称,则代码将更易于阅读。 CreateFileCreateScreenshotFile可能会更好。