如何通过Borland C ++中的Socket发送NULL

时间:2014-06-17 02:30:31

标签: c++ borland-c++

我需要将字符串值发送到特定的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);
  }
}

2 个答案:

答案 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。所以你的选择是:

  1. String
  2. 中嵌入空字节
  3. 使用其他发送功能。
  4. 您是否尝试过阅读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。它可以是窄弦或宽弦。发布问题时应包含此信息。