2009-11-06 46 views
0

我正在写一个程序从一台PC发送文件到另一台。我试图用char* buffer发送它,但我遇到了一些问题。我认为它发送缓冲区,但结果是一个大小为0千字节的文件。我怀疑我没有将缓冲区写入文件,但我确实不知道。我的缓冲区数据来自* bmp文件。我在这里找到了几乎同样的问题,但我真的需要更多的解释。如何传输缓冲区? TTCpServer/TTcpClient

我正在使用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); 
} 
+0

如果您使用编辑页面上提供的代码格式,可以更轻松地阅读您的代码。突出显示您的代码并单击小101010代码示例按钮。 – 2009-11-09 16:36:50

回答

0
  • 你的客户端使用TTcpServer和服务器使用TTcpClient。这很混乱,可能不正确(不正确的术语或不正确的代码)。
  • 对于BufSize参数SendBufReceiveBuf,您的代码将发送sizeof(buffer)bufferchar *(指向char的指针),并且指针的大小在x86上是32位。 sizeof告诉变量本身的大小,而不是变量指向的内容。 C和C++甚至不知道变量指向的大小,因为buffer可能是未初始化的,或者是NULL,或者它可能只是其他地方另一个缓冲区的别名,依此类推。
  • “客户端”代码(接收缓冲区的代码)无法达到预期的数据大小。要解决这个问题,您应该在发送内容之前发送大小。请注意,您的CreateFile函数将需要将此大小作为参数,以便它知道buffer有多大。
  • “客户端”代码(接收缓冲区的代码)从不为缓冲区分配空间。
  • 建议:CreateFileWindows API function。如果您避免将特定于应用程序的功能与通用Windows API函数的名称相同,那么您的代码将更易于阅读。 CreateScreenshotFileSaveScreenshot可能会更好。