如何发送一个结构作为数据在UDP上使用SendBuffer
How to send a structure as data on UDP using SendBuffer?
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)
这将给出结构的实际大小。有了这个,你就可以发送完整的结构。在另一边接收时,将其类型转换回相同的结构。
相关文章:
- 发送固定大小的 UDP 数据包
- 使用C++将UDP数据包存储在Structure中
- 读取访问冲突. _Mycont 在 C++ 中将 udp 数据放入向量时出现 nullptr 错误
- 如何使用 ZeroMQ 在特定端口上监听和解析 UDP 数据?
- 在高数据包速率下最大限度地减少丢弃的 UDP 数据包 (Windows 10)
- Qt 在可预测的秒数后跳过 UDP 数据包
- 高频接收UDP数据包:丢包?
- 为 posix recv 设置超时会导致 udp 数据包丢失吗?
- 了解 UDP 数据包大小限制的 TCP 数据包大小限制以及它在 boost::asio 编程级别的含义
- 获取进入UDP数据包的目标端口
- 操纵Windows Explorer窗口时,UDP数据包会掉落
- C++ 使用 recvmmsg 丢弃 UDP 数据包
- 如何在QT中接收适当的UDP数据包
- 使用ASIO捕获大量UDP数据包
- 如何正确接收多播UDP数据包
- 套接字:在没有memcpy的情况下,使用recvfrom将UDP数据获取到字对齐的缓冲区
- 服务器未收到UDP数据包,花费数小时试图找出问题所在
- 当接收缓冲区几乎满时,阻止UDP数据包被部分截断
- 如何检查UDP数据包是否在发送器上发送
- 使用 QNX 实时操作系统实时接收 UDP 数据包