2009-11-06 2 views
0

한 PC에서 다른 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 코드 샘플 버튼을 클릭하십시오. –

답변

0
  • 당신의 클라이언트는 TTcpServer를 사용하고, 서버는 TTcpClient를 사용합니다. 이것은 혼동스럽고 부정확 할 수 있습니다 (잘못된 용어 또는 잘못된 코드).
  • BufSize 매개 변수가 SendBufReceiveBuf 인 경우 코드에서 sizeof(buffer)을 전송합니다. bufferchar * (char에 대한 포인터)이고 포인터의 크기는 x86에서 32 비트입니다. sizeof은 변수가 가리키는 것이 아니라 변수 자체의 크기를 알려줍니다. C와 C++은 buffer이 초기화되지 않았거나 NULL이거나 다른 버퍼의 다른 별칭 일 수 있기 때문에 변수가 가리키는 크기조차 모릅니다.
  • "클라이언트"코드 (버퍼를 수신하는 코드)는 예상되는 데이터 크기를 처리 할 방법이 없습니다. 이 문제를 해결하려면 내용을 보내기 전에 크기를 보내야합니다. CreateFile 함수는 그 크기를 매개 변수로 가져와야하므로 buffer의 크기가 얼마나 큰지 알 수 있습니다.
  • "클라이언트"코드 (버퍼를 수신하는 코드)는 버퍼 공간을 할당하지 않습니다.
  • 제안 : CreateFileWindows API function입니다. 응용 프로그램 별 함수에 일반 Windows API 함수와 동일한 이름을 지정하지 않으면 코드를 읽기가 더 쉬워집니다. CreateScreenshotFile 또는 SaveScreenshot 일 가능성이 있습니다.
관련 문제