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