您的使用sizeof()
肯定是问题所在。您发送的数据指定了指向缓冲区的指针的大小,而不是缓冲区本身的大小。指针的大小在 32 位中为 4,在 64 位中为 8。您需要使用实际缓冲区大小而不是指针大小。
而不是使用new[]
运算符,您应该使用 VCL 的String
类,例如:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s = MemoEnter->Text;
TcpClient->SendBuf(s.c_str(), ByteLength(s));
LogOut->Lines->Add(s);
}
请注意,这String
是UnicodeString
. 如果接收者不期望UTF-16
编码数据,那么您需要在发送数据之前将数据转换为另一种编码,例如:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s = MemoEnter->Text;
UTF8String utf8 = s;
TcpClient->SendBuf(utf8.c_str(), utf8.Length());
LogOut->Lines->Add(s);
}
或者:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s = MemoEnter->Text;
AnsiString ansi = s; // <-- potential data loss for non-ASCII characters!
TcpClient->SendBuf(ansi.c_str(), ansi.Length());
LogOut->Lines->Add(s);
}
或者:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String s = MemoEnter->Text;
AnsiStringT<SomeCodePage> ansi = s; // <-- use a suitable codepage to avoid data loss!
TcpClient->SendBuf(ansi.c_str(), ansi.Length());
LogOut->Lines->Add(s);
}