Использование sizeof()
определенно является проблемой.Вы отправляете свои данные, указывая размер указателя, который указывает на буфер, а не размер самого буфера.Размер указателя составляет 4 в 32-разрядном и 8 в 64-разрядном.Вам нужно использовать фактический размер буфера вместо размера указателя.
Вместо того, чтобы использовать оператор new[]
, вместо этого следует использовать класс String
VCL, например:
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);
}