2009-11-06 73 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可能會更好。