2 Bytes for Message::Length is enough
This commit is contained in:
parent
f9dcb50e6f
commit
bb223db504
|
@ -11,7 +11,7 @@ public:
|
|||
byte Code; // 消息代码
|
||||
byte Reply:1; // 是否响应指令
|
||||
byte Error:1; // 是否错误
|
||||
uint Length; // 数据长度
|
||||
ushort Length; // 数据长度
|
||||
byte* Data; // 数据。指向子类内部声明的缓冲区
|
||||
|
||||
void* State; // 其它状态数据
|
||||
|
|
|
@ -58,16 +58,17 @@ bool TinyMessage::Read(Stream& ms)
|
|||
if(Dest == Src) return false;
|
||||
|
||||
// 校验剩余长度
|
||||
if(ms.Remain() < Length + 2) return false;
|
||||
ushort len = Length;
|
||||
if(ms.Remain() < len + 2) return false;
|
||||
|
||||
// 避免错误指令超长,导致溢出
|
||||
if(Data == _Data && Length > ArrayLength(_Data))
|
||||
if(Data == _Data && len > ArrayLength(_Data))
|
||||
{
|
||||
debug_printf("错误指令,长度 %d 大于消息数据缓冲区长度 %d \r\n", Length, ArrayLength(_Data));
|
||||
debug_printf("错误指令,长度 %d 大于消息数据缓冲区长度 %d \r\n", len, ArrayLength(_Data));
|
||||
//assert_param(false);
|
||||
return false;
|
||||
}
|
||||
if(Length > 0) ms.Read(Data, 0, Length);
|
||||
if(len > 0) ms.Read(Data, 0, len);
|
||||
|
||||
// 读取真正的校验码
|
||||
Checksum = ms.ReadUInt16();
|
||||
|
@ -94,25 +95,26 @@ void TinyMessage::Write(Stream& ms) const
|
|||
|
||||
TS("TinyMessage::Write");
|
||||
|
||||
ushort len = Length;
|
||||
// 实际数据拷贝到占位符
|
||||
TinyMessage* p = (TinyMessage*)this;
|
||||
auto p = (TinyMessage*)this;
|
||||
p->_Code = Code;
|
||||
p->_Length = Length;
|
||||
p->_Length = len;
|
||||
p->_Reply = Reply;
|
||||
p->_Error = Error;
|
||||
|
||||
byte* buf = ms.Current();
|
||||
auto buf = ms.Current();
|
||||
// 不要写入验证码
|
||||
ms.Write((byte*)&Dest, 0, HeaderSize);
|
||||
if(Length > 0) ms.Write(Data, 0, Length);
|
||||
ms.Write(&Dest, 0, HeaderSize);
|
||||
if(len > 0) ms.Write(Data, 0, len);
|
||||
|
||||
// 计算Crc之前,需要清零TTL和Retry
|
||||
byte fs = buf[3];
|
||||
TFlags* f = (TFlags*)&buf[3];
|
||||
auto f = (TFlags*)&buf[3];
|
||||
f->TTL = 0;
|
||||
f->Retry = 0;
|
||||
|
||||
p->Checksum = p->Crc = Crc::Hash16(Array(buf, HeaderSize + Length));
|
||||
p->Checksum = p->Crc = Crc::Hash16(Array(buf, HeaderSize + len));
|
||||
|
||||
// 还原数据
|
||||
buf[3] = fs;
|
||||
|
@ -165,11 +167,12 @@ void TinyMessage::Show() const
|
|||
#if MSG_DEBUG
|
||||
assert_ptr(this);
|
||||
msg_printf("0x%02X => 0x%02X Code=0x%02X Flag=0x%02X Seq=0x%02X Retry=%d", Src, Dest, Code, *((byte*)&_Code+1), Sequence, Retry);
|
||||
if(Length > 0)
|
||||
ushort len = Length;
|
||||
if(len > 0)
|
||||
{
|
||||
assert_ptr(Data);
|
||||
msg_printf(" Data[%d]=", Length);
|
||||
ByteArray(Data, Length).Show();
|
||||
msg_printf(" Data[%d]=", len);
|
||||
ByteArray(Data, len).Show();
|
||||
}
|
||||
if(Checksum != Crc) msg_printf(" Crc Error 0x%04x [%04X]", Crc, __REV16(Crc));
|
||||
msg_printf("\r\n");
|
||||
|
@ -660,10 +663,10 @@ void TinyController::ShowStat()
|
|||
|
||||
void MessageNode::SetMessage(TinyMessage& msg)
|
||||
{
|
||||
Sequence = msg.Sequence;
|
||||
Period = 0;
|
||||
Times = 0;
|
||||
LastSend = 0;
|
||||
Sequence = msg.Sequence;
|
||||
Period = 0;
|
||||
Times = 0;
|
||||
LastSend = 0;
|
||||
|
||||
// 注意,此时指针位于0,而内容长度为缓冲区长度
|
||||
Stream ms(Data, ArrayLength(Data));
|
||||
|
|
|
@ -30,25 +30,20 @@ bool TokenMessage::Read(Stream& ms)
|
|||
Code = temp & 0x3f;
|
||||
Reply = temp >> 7;
|
||||
Error = (temp >> 6) & 0x01;
|
||||
Length = ms.ReadByte();
|
||||
//Length = ms.ReadByte();
|
||||
ushort len = ms.ReadEncodeInt();
|
||||
Length = len;
|
||||
|
||||
// 占位符拷贝到实际数据
|
||||
/*Code = _Code;
|
||||
Length = _Length;
|
||||
Reply = _Reply;
|
||||
Error = _Error;*/
|
||||
if(ms.Remain() < len) return false;
|
||||
|
||||
if(ms.Remain() < Length) return false;
|
||||
|
||||
//assert_param2(Data != _Data || Length <= ArrayLength(_Data), "令牌消息太大,缓冲区无法放下");
|
||||
// 避免错误指令超长,导致溢出
|
||||
if(Data == _Data && Length > ArrayLength(_Data))
|
||||
if(Data == _Data && len > ArrayLength(_Data))
|
||||
{
|
||||
debug_printf("错误指令,长度 %d 大于消息数据缓冲区长度 %d \r\n", Length, ArrayLength(_Data));
|
||||
debug_printf("错误指令,长度 %d 大于消息数据缓冲区长度 %d \r\n", len, ArrayLength(_Data));
|
||||
//assert_param(false);
|
||||
return false;
|
||||
}
|
||||
if(Length > 0) ms.Read(Data, 0, Length);
|
||||
if(len > 0) ms.Read(Data, 0, len);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -58,17 +53,6 @@ void TokenMessage::Write(Stream& ms) const
|
|||
{
|
||||
assert_ptr(this);
|
||||
|
||||
// 实际数据拷贝到占位符
|
||||
/*TokenMessage* p = (TokenMessage*)this;
|
||||
p->_Code = Code;
|
||||
p->_Reply = Reply;
|
||||
p->_Error = Error;
|
||||
p->_Length = Length;
|
||||
|
||||
byte tmp = _Code | (_Reply << 7) | (_Error << 6);
|
||||
ms.Write(tmp);
|
||||
ms.Write(_Length);*/
|
||||
|
||||
byte tmp = Code | (Reply << 7) | (Error << 6);
|
||||
ms.Write(tmp);
|
||||
|
||||
|
@ -76,8 +60,9 @@ void TokenMessage::Write(Stream& ms) const
|
|||
ms.Write((byte)0);
|
||||
else
|
||||
{
|
||||
ms.WriteEncodeInt(Length);
|
||||
if(Length > 0) ms.Write(Data, 0, Length);
|
||||
ushort len = Length;
|
||||
ms.WriteEncodeInt(len);
|
||||
if(len > 0) ms.Write(Data, 0, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,13 +115,14 @@ void TokenMessage::Show() const
|
|||
debug_printf(" _Code=0x%02X", Code);
|
||||
}
|
||||
|
||||
if(Length > 0)
|
||||
ushort len = Length;
|
||||
if(len > 0)
|
||||
{
|
||||
assert_ptr(Data);
|
||||
debug_printf(" Data[%d]=", Length);
|
||||
debug_printf(" Data[%d]=", len);
|
||||
// 大于32字节时,反正都要换行显示,干脆一开始就换行,让它对齐
|
||||
if(Length > 32) debug_printf("\r\n");
|
||||
ByteArray(Data, Length).Show();
|
||||
if(len > 32) debug_printf("\r\n");
|
||||
ByteArray(Data, len).Show();
|
||||
}
|
||||
debug_printf("\r\n");
|
||||
#endif
|
||||
|
@ -233,8 +219,8 @@ bool TokenController::Valid(const Message& msg)
|
|||
// 合法来源验证,暂时验证云平台,其它连接将来验证
|
||||
if(Server)
|
||||
{
|
||||
IPEndPoint* svr = (IPEndPoint*)Server;
|
||||
IPEndPoint* rmt = (IPEndPoint*)msg.State;
|
||||
auto svr = (IPEndPoint*)Server;
|
||||
auto rmt = (IPEndPoint*)msg.State;
|
||||
|
||||
if(!rmt || *svr != *rmt)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue