我需要将字符串值发送到特定的ipAddress,但字符串值应该包含两个Ascii Null
值。
例如:NULL + message + NULL
我设法使用sck->Socket->SendText(Edit1->Text);
发送邮件,但我不知道如何通过SocketClient
组件发送NULL值。它不需要是Send Text方法。任何允许发送带有两个NULL字符的数据包的方法都可以。
我对C ++很新。如果任何人可以帮助我,将不胜感激。提前致谢。
void __fastcall TFrmCageCom::Reset(TObject Sender) {
TClientSocket socket = new TClientSocket(this);
socket = sockets[1]; // Getting a socket from
if (socket->Active) {
String data = GeneratePackect(isNumeric, "", size, false);
String packet = "@1@2@3@"; // "@" sign necessary to divide each character in
// receivers end
socket->Socket->SendText(packet);
}
}
答案 0 :(得分:2)
我不知道Edit1->Text
的类型,因此您可能需要执行以下操作才能转换为const char*
到ASCIIZ缓冲区或std::string
。似乎SendBuf
支持二进制传输 - 请参阅http://bcbjournal.org/articles/vol4/0004/Using_sockets.htm?PHPSESSID=ec48204948f2965316eec877d313d231
#include <string>
std::string s("\0");
s += Edit1->Text; // <--- not sure about this line!
s += '\0';
sck->Socket->SendBuf(s.data(), s.size());
也就是说,这个套接字库不是标准C ++的一部分,所以对于这类问题,找到一些Borland特定的库文档是必要的。
答案 1 :(得分:1)
首先,TClientSocket
不是Borland C ++的一部分。它是VCL库的一部分,它与C ++ Builder和Delphi打包在一起;这两者都是Borland C ++的不同产品。最好提一下你正在使用哪个产品和哪个版本(这个套接字库多年来经历了变化 - 就像String
一样)。
TClientWinSocket::SendText
用于发送String
。所以你的选择是:
String
。您是否尝试过阅读the documentation(或使用代码洞察力)?您可以使用SendBuf
:
socket->Socket->SendBuf( "", 1 );
socket->Socket->SendText( packet );
socket->Socket->SendBuf( "", 1 );
或者,由于String
具有operator+
重载和来自char
的隐式构造函数,因此您可以写:
socket->Socket->SendText( '\0' + packet + '\0');
其他一些评论。您发布的代码是非法的:
TClientSocket socket = new TClientSocket(this);
您不能自动分配VCL对象,这应该无法编译。我想知道你的意思是TClientSocket *socket = new TClientSocket(this)
。 (如果是这样,请复制粘贴您的代码,而不是从内存中输入内容,谁知道您发布的内容与实际代码之间存在哪些细微差别。)
如果你的确意味着我的意思,那你就有一个错误,因为:
socket = sockets[1];
使socket
指向sockets[1]
,而不是指向new
'的套接字。 (在C ++中使用带有指针的赋值运算符意味着更改指针所指向的位置;通常,如果要进行对象赋值,则需要编写*ptr = *other_ptr;
。但是,VCL对象大多数是不可复制的。
接下来,Edit1->Text
的行为取决于您是否使用Unicode。它可以是窄弦或宽弦。发布问题时应包含此信息。