-
Notifications
You must be signed in to change notification settings - Fork 211
/
Copy pathPacket.cpp
executable file
·115 lines (92 loc) · 2.27 KB
/
Packet.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
Copyright © 2017-2020, orcaer@yeah.net All rights reserved.
Author: orcaer@yeah.net
Last modified: 2019-10-24
Description: https://github.com/wlgq2/uv-cpp
*/
#include "include/Packet.hpp"
using namespace uv;
uint8_t Packet::HeadByte = 0x7e;
uint8_t Packet::EndByte = 0xe7;
Packet::DataMode Packet::Mode = Packet::DataMode::LittleEndian;
Packet::Packet()
:buffer_(""),
dataSize_(0)
{
}
uv::Packet::~Packet()
{
}
int uv::Packet::readFromBuffer(PacketBuffer* packetbuf, Packet& out)
{
std::string data("");
while (true)
{
auto size = packetbuf->readSize();
//数据小于包头大小
if (size < PacketMinSize())
{
return -1;
}
//找包头
uint16_t dataSize;
packetbuf->readBufferN(data, sizeof(dataSize)+1);
if ((uint8_t)data[0] != HeadByte) //包头不正确,从下一个字节开始继续找
{
data.clear();
packetbuf->clearBufferN(1);
continue;
}
UnpackNum((uint8_t*)data.c_str() + 1, dataSize);
uint16_t msgsize = dataSize + PacketMinSize();
//包不完整
if (size < msgsize)
{
return -1;
}
packetbuf->clearBufferN(sizeof(dataSize)+1);
packetbuf->readBufferN(data, dataSize +1);
//检查包尾
if ((uint8_t)data.back() == EndByte)
{
packetbuf->clearBufferN(dataSize +1);
break;
}
}
out.swap(data);
return 0;
}
void uv::Packet::pack(const char* data, uint16_t size)
{
dataSize_ = size;
buffer_.resize(size+ PacketMinSize());
buffer_[0] = HeadByte;
PackNum(&buffer_[1],size);
std::copy(data, data + size, &buffer_[sizeof(HeadByte) + sizeof(dataSize_)]);
buffer_.back() = EndByte;
}
const char* uv::Packet::getData()
{
return buffer_.c_str()+sizeof(HeadByte)+sizeof(dataSize_);
}
uint16_t uv::Packet::DataSize()
{
return dataSize_;
}
const std::string& uv::Packet::Buffer()
{
return buffer_;
}
const uint32_t uv::Packet::PacketSize()
{
return (uint32_t)buffer_.size();
}
void uv::Packet::swap(std::string& str)
{
buffer_.swap(str);
dataSize_ = (uint16_t)(buffer_.size() - PacketMinSize());
}
uint32_t uv::Packet::PacketMinSize()
{
return 4;
}