[英]C++ Builder TtcpClient
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int size = MemoEnter->GetTextLen() + 1;
wchar_t *szBuff = new wchar_t[size];
memset(szBuff, 0, sizeof(szBuff));
MemoEnter->GetTextBuf((wchar_t *)szBuff, size);
TcpClient->SendBuf(szBuff, sizeof(szBuff));
LogOut->Lines->Add(szBuff);
delete []szBuff;
}
为什么TcpClient没有发送任何东西? 服务器还可以。 连接还可以。 Telnet将数据发送到服务器,但此代码不会。
伙计们! 我试过了
TcpClient->SendBuf("fsd", 3);
仍然一无所获
这可能导致了这个问题:
sizeof(szBuff); // Returns the sizeof a wchar_t*,
// not the number of characters in szBuff
更改:
memset(szBuff, 0, sizeof(szBuff));
...
TcpClient->SendBuf(szBuff, sizeof(szBuff));
至:
memset(szBuff, 0, sizeof(wchar_t) * size);
...
TcpClient->SendBuf(szBuff, wcslen(szBuff));
如果TcpClient->SendBuf()
的第二个参数是字节数,而不是字符, TcpClient->SendBuf()
改为:
TcpClient->SendBuf(szBuff, wcslen(szBuff) * sizeof(wchar_t));
你对sizeof()
使用肯定是问题所在。 您发送的数据指定指向缓冲区的指针大小,而不是缓冲区本身的大小。 指针的大小是32位的4和64位的8。 您需要使用实际的缓冲区大小而不是指针大小。
您应该使用VCL的String
类,而不是使用new[]
运算符,例如:
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.