gpt4 book ai didi

c++ - 通过 Indy UDP 正确发送和接收结构

转载 作者:行者123 更新时间:2023-11-28 02:37:04 25 4
gpt4 key购买 nike

考虑以下使用 Borland 2007 和 Indy UDP 服务器和客户端的最小程序:

struct DATA_PACKAGE
{
int t;
int x;
int y;
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
DATA_PACKAGE a;
a.t = 3;
a.x = 2;
a.y = 1;
Form1->Memo1->Lines->Add("sent " + IntToStr(sizeof(DATA_PACKAGE)));
Form1->UDPClient1->SendBuffer(server,port,RawToBytes(&a, sizeof(DATA_PACKAGE)));
}

void __fastcall TForm1::UDPServer1UDPRead(TObject *Sender, TBytes AData,
TIdSocketHandle *ABinding)
{
DATA_PACKAGE r;
Form1->Memo1->Lines->Add("received " + IntToStr(sizeof(AData)));
BytesToRaw(AData, &r, sizeof(AData));
Form1->Memo1->Lines->Add(IntToStr(r.t) + " " + IntToStr(r.x) + " " + IntToStr(r.y));
}

输出:

sent 12
received 4
3 4717901 0

首先,为什么发送了12个字节,却只收到了4个字节?

其次,x 和 y 发生了什么?

当我将 t,x,y 的数据类型更改为 short 时,我得到:

sent 6 
received 4
3 2 0

环顾四周,我发现结构的打包(可能还有字节顺序?)很重要,但我找不到如何正确设计它的明确指南。

最佳答案

TBytes 是动态字节数组,它由 RTL 实现为指针,这就是 sizeof(AData) 返回 4 的原因。不要使用 sizeof(AData),请改用 AData.Length 属性:

void __fastcall TForm1::UDPServer1UDPRead(TObject *Sender, TBytes AData,
TIdSocketHandle *ABinding)
{
DATA_PACKAGE r;
Form1->Memo1->Lines->Add("received " + IntToStr(AData.Length));
BytesToRaw(AData, &r, AData.Length);
Form1->Memo1->Lines->Add(IntToStr(r.t) + " " + IntToStr(r.x) + " " + IntToStr(r.y));
}

关于c++ - 通过 Indy UDP 正确发送和接收结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27088377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com