我正在编写一个程序,用于将文件从一台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);
}
答案 0 :(得分:0)
BufSize
和SendBuf
的{{1}}参数,您的代码会发送ReceiveBuf
。 sizeof(buffer)
是buffer
(指向char *
的指针),指针的大小在x86上是32位。 char
告诉变量本身的大小,而不是变量指向的大小。 C和C ++甚至不知道变量所指向的大小,因为sizeof
可能是未初始化的,或者是NULL,或者它可能只是别处其他缓冲区的别名,依此类推。buffer
函数需要将该大小作为参数,以便知道CreateFile
的大小。buffer
是Windows API function。如果避免为特定于应用程序的函数提供与通用Windows API函数相同的名称,则代码将更易于阅读。 CreateFile
或CreateScreenshotFile
可能会更好。