载入中...
搜索中...
未找到
NetStream.cpp
浏览该文件的文档.
1#include "network/NetStream.h"
2
3#include <cstring>
4
5namespace eve::network {
6
7namespace {
8
9void putLe16(std::vector<char>& buf, uint16_t v) {
10 buf.push_back(static_cast<char>(v & 0xff));
11 buf.push_back(static_cast<char>((v >> 8) & 0xff));
12}
13
14void putLe32(std::vector<char>& buf, uint32_t v) {
15 buf.push_back(static_cast<char>(v & 0xff));
16 buf.push_back(static_cast<char>((v >> 8) & 0xff));
17 buf.push_back(static_cast<char>((v >> 16) & 0xff));
18 buf.push_back(static_cast<char>((v >> 24) & 0xff));
19}
20
21void putLe64(std::vector<char>& buf, uint64_t v) {
22 for (int i = 0; i < 8; ++i) {
23 buf.push_back(static_cast<char>((v >> (8 * i)) & 0xff));
24 }
25}
26
27uint16_t getLe16(const char* p) {
28 return static_cast<uint16_t>(uint8_t(p[0])) |
29 (static_cast<uint16_t>(uint8_t(p[1])) << 8);
30}
31
32uint32_t getLe32(const char* p) {
33 return static_cast<uint32_t>(uint8_t(p[0])) |
34 (static_cast<uint32_t>(uint8_t(p[1])) << 8) |
35 (static_cast<uint32_t>(uint8_t(p[2])) << 16) |
36 (static_cast<uint32_t>(uint8_t(p[3])) << 24);
37}
38
39uint64_t getLe64(const char* p) {
40 uint64_t v = 0;
41 for (int i = 0; i < 8; ++i) {
42 v |= (uint64_t(uint8_t(p[i])) << (8 * i));
43 }
44 return v;
45}
46
47} // namespace
48
49void NetWriter::put(const void* d, size_t n) {
50 if (!d || n == 0) return;
51 const char* p = static_cast<const char*>(d);
52 buf_.insert(buf_.end(), p, p + n);
53}
54
55void NetWriter::writeU8(uint8_t v) {
56 buf_.push_back(static_cast<char>(v));
57}
58
59void NetWriter::writeI8(int8_t v) {
60 buf_.push_back(static_cast<char>(v));
61}
62
63void NetWriter::writeU16(uint16_t v) {
64 putLe16(buf_, v);
65}
66
67void NetWriter::writeI16(int16_t v) {
68 putLe16(buf_, static_cast<uint16_t>(v));
69}
70
71void NetWriter::writeU32(uint32_t v) {
72 putLe32(buf_, v);
73}
74
75void NetWriter::writeI32(int32_t v) {
76 putLe32(buf_, static_cast<uint32_t>(v));
77}
78
79void NetWriter::writeU64(uint64_t v) {
80 putLe64(buf_, v);
81}
82
83void NetWriter::writeI64(int64_t v) {
84 putLe64(buf_, static_cast<uint64_t>(v));
85}
86
88 uint32_t bits = 0;
89 static_assert(sizeof(bits) == sizeof(v), "float must be 32-bit");
90 std::memcpy(&bits, &v, sizeof(bits));
91 putLe32(buf_, bits);
92}
93
94void NetWriter::writeF64(double v) {
95 uint64_t bits = 0;
96 static_assert(sizeof(bits) == sizeof(v), "double must be 64-bit");
97 std::memcpy(&bits, &v, sizeof(bits));
98 putLe64(buf_, bits);
99}
100
102 buf_.push_back(v ? 1 : 0);
103}
104
105void NetWriter::writeString(const std::string& s) {
106 putLe32(buf_, static_cast<uint32_t>(s.size()));
107 put(s.data(), s.size());
108}
109
110void NetWriter::writeBytes(const void* d, size_t n) {
111 putLe32(buf_, static_cast<uint32_t>(n));
112 put(d, n);
113}
114
115NetReader::NetReader(const void* d, size_t n) {
116 init(d, n);
117}
118
119NetReader::NetReader(const std::vector<char>& d) {
120 init(d.data(), d.size());
121}
122
123bool NetReader::init(const void* d, size_t n) {
124 if (d == nullptr && n != 0) {
125 ok_ = false;
126 return false;
127 }
128 data_ = static_cast<const char*>(d);
129 size_ = n;
130 pos_ = 0;
131 ok_ = true;
132 return true;
133}
134
135bool NetReader::take(void* out, size_t n) {
136 if (!ok_) return false;
137 if (n > size_ - pos_) {
138 ok_ = false;
139 return false;
140 }
141 if (out && n > 0) std::memcpy(out, data_ + pos_, n);
142 pos_ += n;
143 return true;
144}
145
146size_t NetReader::remaining() const {
147 if (!ok_) return 0;
148 return size_ >= pos_ ? size_ - pos_ : 0;
149}
150
151uint8_t NetReader::u8() {
152 uint8_t v = 0;
153 take(&v, 1);
154 return v;
155}
156
158 int8_t v = 0;
159 take(&v, 1);
160 return v;
161}
162
163uint16_t NetReader::u16() {
164 char tmp[2] = {0, 0};
165 if (!take(tmp, 2)) return 0;
166 return getLe16(tmp);
167}
168
169int16_t NetReader::i16() {
170 return static_cast<int16_t>(u16());
171}
172
173uint32_t NetReader::u32() {
174 char tmp[4] = {0, 0, 0, 0};
175 if (!take(tmp, 4)) return 0;
176 return getLe32(tmp);
177}
178
179int32_t NetReader::i32() {
180 return static_cast<int32_t>(u32());
181}
182
183uint64_t NetReader::u64() {
184 char tmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
185 if (!take(tmp, 8)) return 0;
186 return getLe64(tmp);
187}
188
189int64_t NetReader::i64() {
190 return static_cast<int64_t>(u64());
191}
192
194 uint32_t bits = u32();
195 float v = 0.f;
196 std::memcpy(&v, &bits, sizeof(v));
197 return v;
198}
199
201 uint64_t bits = u64();
202 double v = 0.0;
203 std::memcpy(&v, &bits, sizeof(v));
204 return v;
205}
206
208 return u8() != 0;
209}
210
211std::string NetReader::str() {
212 uint32_t n = u32();
213 if (!ok_) return {};
214 std::string out;
215 out.resize(n);
216 if (!take(out.data(), n)) {
217 out.clear();
218 return out;
219 }
220 return out;
221}
222
223std::vector<char> NetReader::bytes(size_t n) {
224 std::vector<char> out;
225 uint32_t len = u32();
226 if (!ok_ || len != n || n > remaining()) {
227 ok_ = false;
228 return out;
229 }
230 out.resize(n);
231 if (!take(out.data(), n)) out.clear();
232 return out;
233}
234
235} // namespace eve::network
glm::vec3 n
Definition Grass.cpp:64
glm::vec4 p[6]
int d
int v
uint32_t s
Definition Weather.cpp:28
size_t remaining() const
std::vector< char > bytes(size_t n)
bool init(const void *d, size_t n)
void writeU8(uint8_t v)
Definition NetStream.cpp:55
void writeI64(int64_t v)
Definition NetStream.cpp:83
void writeBytes(const void *d, size_t n)
void writeF32(float v)
Definition NetStream.cpp:87
void writeI16(int16_t v)
Definition NetStream.cpp:67
void writeString(const std::string &s)
void writeI32(int32_t v)
Definition NetStream.cpp:75
void writeF64(double v)
Definition NetStream.cpp:94
void writeI8(int8_t v)
Definition NetStream.cpp:59
void writeU64(uint64_t v)
Definition NetStream.cpp:79
void writeU16(uint16_t v)
Definition NetStream.cpp:63
void writeU32(uint32_t v)
Definition NetStream.cpp:71