如何发送一个结构作为数据在UDP上使用SendBuffer

How to send a structure as data on UDP using SendBuffer?

本文关键字:UDP 数据 SendBuffer 何发送 结构 一个      更新时间:2023-10-16
typedef struct
{
    char cStartByte;  // Set Cmd 0xB1
   int  iTotalBytes; 
   char cSeqNum;        // 0 to 99 repeating
   char cCommand;   //
   char cPrintCmd;  //
       float fData[8]
} CMD,*psCmdOut;

在代码中尝试了许多选项,没有成功。要使用上述结构吗?

  UDPClient1->SendBuffer(EHost->Text,12000, ????);

你不能使用套接字按原样发送你的结构:你需要序列化它。您需要为数据交换创建一种通用格式,通常是像这样的字符数组。

代码:

unsigned char* ToCharArray(psCmdOut s)
{
    unsigned char serial[12]; //32-bit arch
    serial[0] = s.cStartByte;
    /*etc.*/
    return serial;
}

您可以在(char*)中来回转换您的结构,但我强烈建议不要这样做:隐式转换隐藏了诸如端序、内部内存填充和对齐等微妙之处,这会以不可预测的方式破坏您的系统。

答案取决于你的Indy版本。

在Indy 8和9中,SendBuffer()具有以下签名:

void __fastcall SendBuffer(String AHost, const int APort, void* ABuffer, const int AByteCount);

你可以这样写:

CMD cmd;
// fill cmd as needed...
UDPClient1->SendBuffer(EHost->Text, 12000, &cmd, sizeof(cmd));

在Indy 10中,SendBuffer()被改为采用TIdBytes(动态字节数组):

void __fastcall SendBuffer(const String AHost, const TIdPort APort, const TIdBytes ABuffer);

所以你不能再直接传递结构指针了。但是,Indy 10有一个RawToBytes()函数来从内存块创建TIdBytes,所以您可以这样做:

CMD cmd;
// fill cmd as needed...
UDPClient1->SendBuffer(EHost->Text, 12000, RawToBytes(&cmd, sizeof(cmd)));

正如@Sam建议的:

UDPClient1 -> SendBuffer (EHost ->文本,12000年,reinterpret_cast(及cmd_command));

但是结构的长度也是有要求的。所以它将是:

UDPClient1->SendBuffer(EHost->Text,12000,reinterpret_cast<char*>(&cmd_command), sizeof(cmd_command));

并且我认为如果你通过添加

来包装结构会更好
#pragma pack(1)

这将给出结构的实际大小。有了这个,你就可以发送完整的结构。在另一边接收时,将其类型转换回相同的结构。