载入中...
搜索中...
未找到
Network.cpp
浏览该文件的文档.
1#include "network/Network.h"
2#include "network/NetWorker.h"
3#include "network/TcpSocket.h"
4#include "network/UdpSocket.h"
6#include "network/Channel.h"
7#include "network/Session.h"
8#include "network/NetStream.h"
9#include "network/UdpLink.h"
10#include "network/NetHost.h"
11#include "network/NetRpc.h"
12#include "data/ByteData.h"
13#include "event/Event.h"
14
15#include <Poco/Net/StreamSocket.h>
16#include <Poco/Net/ServerSocket.h>
17#include <Poco/Net/DatagramSocket.h>
18#include <Poco/Net/SocketAddress.h>
19#include <Poco/Net/NetException.h>
20#include <Poco/Exception.h>
21
22#include <simplesquirrel/simplesquirrel.hpp>
23#include <algorithm>
24#include <chrono>
25#include <functional>
26
27namespace eve::network {
28
29namespace {
30
31void callScript1(const ssq::Object& obj, const std::string& s) {
32 if (obj.isEmpty()) return;
33 ssq::Function f = obj.toFunction();
34 if (f.isEmpty()) return;
35 HSQUIRRELVM raw = f.getHandle();
36 SQInteger top = sq_gettop(raw);
37 sq_pushobject(raw, f.getRaw());
38 sq_pushroottable(raw);
40 sq_call(raw, 2, SQFalse, SQTrue);
41 sq_settop(raw, top);
42}
43
44void callScript2(const ssq::Object& obj, int64_t a, const std::string& s) {
45 if (obj.isEmpty()) return;
46 ssq::Function f = obj.toFunction();
47 if (f.isEmpty()) return;
48 HSQUIRRELVM raw = f.getHandle();
49 SQInteger top = sq_gettop(raw);
50 sq_pushobject(raw, f.getRaw());
51 sq_pushroottable(raw);
54 sq_call(raw, 3, SQFalse, SQTrue);
55 sq_settop(raw, top);
56}
57
58void callScript3(const ssq::Object& obj, int64_t a, int64_t b, const std::string& s) {
59 if (obj.isEmpty()) return;
60 ssq::Function f = obj.toFunction();
61 if (f.isEmpty()) return;
62 HSQUIRRELVM raw = f.getHandle();
63 SQInteger top = sq_gettop(raw);
64 sq_pushobject(raw, f.getRaw());
65 sq_pushroottable(raw);
69 sq_call(raw, 4, SQFalse, SQTrue);
70 sq_settop(raw, top);
71}
72
73} // namespace
74
76
78 worker_ = std::make_unique<NetWorker>(this);
79 worker_->start();
80}
81
83 if (worker_) worker_->stop();
84 worker_.reset();
85}
86
88 return new TcpSocket(this);
89}
90
92 return new UdpSocket(this);
93}
94
95HttpRequest* Network::newHttp(std::string method, std::string url) {
96 return new HttpRequest(this, std::move(method), std::move(url));
97}
98
100 if (!socket) return nullptr;
101 auto* ch = new Channel(socket);
102 bindChannel(socket, ch);
103 return ch;
104}
105
107 return new Session();
108}
109
111 return new NetWriter();
112}
113
114NetReader* Network::newReader(std::string bytes) {
115 auto* r = new NetReader();
116 r->setBytes(bytes);
117 return r;
118}
119
121 if (!socket) return nullptr;
122 auto* link = new UdpLink(this, socket);
123 bindUdpLink(socket, link);
124 return link;
125}
126
128 return link ? new NetRpc(link) : nullptr;
129}
130
132 return new NetHost(this);
133}
134
136 if (sock) udpLinks_[sock] = link;
137}
138
140 if (sock) udpLinks_.erase(sock);
141}
142
144 if (sock) udpHosts_[sock] = host;
145}
146
148 if (sock) udpHosts_.erase(sock);
149}
150
152 timeoutMs_ = ms;
153}
154
156 return timeoutMs_;
157}
158
159void Network::setVerifySsl(bool verify) {
160 verifySsl_ = verify;
161}
162
164 return verifySsl_;
165}
166
168 if (worker_) worker_->post(std::move(c));
169}
170
171void Network::drainForTest(std::vector<NetCompletion>& out) {
172 if (worker_) worker_->drain(out);
173}
174
176 std::lock_guard<std::mutex> lock(watchMu_);
177 if (std::find(watchedTcp_.begin(), watchedTcp_.end(), sock) == watchedTcp_.end())
178 watchedTcp_.push_back(sock);
179}
180
182 std::lock_guard<std::mutex> lock(watchMu_);
183 watchedTcp_.erase(std::remove(watchedTcp_.begin(), watchedTcp_.end(), sock), watchedTcp_.end());
184}
185
187 std::lock_guard<std::mutex> lock(watchMu_);
188 if (std::find(watchedUdp_.begin(), watchedUdp_.end(), sock) == watchedUdp_.end())
189 watchedUdp_.push_back(sock);
190}
191
193 std::lock_guard<std::mutex> lock(watchMu_);
194 watchedUdp_.erase(std::remove(watchedUdp_.begin(), watchedUdp_.end(), sock), watchedUdp_.end());
195}
196
198 std::lock_guard<std::mutex> lock(channelMu_);
199 channels_[sock] = ch;
200}
201
203 std::lock_guard<std::mutex> lock(channelMu_);
204 channels_.erase(sock);
205}
206
208 std::lock_guard<std::mutex> lock(channelMu_);
209 auto it = channels_.find(sock);
210 return it == channels_.end() ? nullptr : it->second;
211}
212
214 std::vector<TcpSocket*> tcpCopy;
215 std::vector<UdpSocket*> udpCopy;
216 {
217 std::lock_guard<std::mutex> lock(watchMu_);
218 tcpCopy = watchedTcp_;
219 udpCopy = watchedUdp_;
220 }
221 for (TcpSocket* sock : tcpCopy) {
222 if (!sock) continue;
223 if (sock->isListening() && sock->server()) {
224 try {
225 Poco::Net::StreamSocket ss = sock->server()->acceptConnection();
226 ss.setBlocking(false);
227 auto peer = std::make_unique<TcpSocket>(this);
228 auto stream = std::make_unique<Poco::Net::StreamSocket>(ss);
229 peer->setConnectedSocket(std::move(stream));
230 TcpSocket* raw = peer.get();
231 sock->pushAccepted(std::move(peer));
232 watchTcp(raw);
235 c.kind = NetKind::Tcp;
236 c.handle = raw;
237 c.reason = "ok";
238 c.peer = raw->getPeer();
239 post(std::move(c));
240 } catch (...) {
241 }
242 }
243 if (sock->isConnected() && sock->stream()) {
244 sock->flushSend();
245 try {
246 char buf[64 * 1024];
247 int n = sock->stream()->receiveBytes(buf, sizeof(buf));
248 if (n > 0) {
251 c.kind = NetKind::Tcp;
252 c.handle = sock;
253 c.bytes = std::make_shared<std::vector<char>>(buf, buf + n);
254 c.peer = sock->getPeer();
255 post(std::move(c));
256 } else if (n == 0) {
259 c.kind = NetKind::Tcp;
260 c.handle = sock;
261 c.reason = "closed";
262 post(std::move(c));
263 unwatchTcp(sock);
264 }
265 } catch (const Poco::Exception&) {
266 } catch (...) {
267 }
268 }
269 }
270 for (UdpSocket* sock : udpCopy) {
271 if (!sock || !sock->datagram()) continue;
272 for (int i = 0; i < 64; ++i) {
273 try {
274 char buf[64 * 1024];
275 Poco::Net::SocketAddress sender;
276 int n = sock->datagram()->receiveFrom(buf, sizeof(buf), sender);
277 if (n <= 0) break; // would-block
280 c.kind = NetKind::Udp;
281 c.handle = sock;
282 c.bytes = std::make_shared<std::vector<char>>(buf, buf + n);
283 c.peer = sender.toString();
284 post(std::move(c));
285 } catch (const Poco::Exception&) {
286 break;
287 } catch (...) {
288 break;
289 }
290 }
291 }
292}
293
294void Network::emitCompletion(const NetCompletion& c) {
295 auto* ev = eve::ModuleManager::getInstance<eve::event::Event>("Event");
296 if (!ev) return;
297
300
301 std::vector<Variant> args;
302 switch (c.type) {
303 case NetEvType::Conn:
304 args.push_back(Variant::makePtr(c.handle));
305 args.push_back(Variant::makeString(c.reason.empty() ? "ok" : c.reason));
306 ev->push(new Message("netconn", args));
307 break;
308 case NetEvType::Data: {
309 Channel* ch = channelFor(static_cast<TcpSocket*>(c.handle));
310 if (ch && c.bytes) {
311 ch->feed(*c.bytes);
312 return;
313 }
314 eve::data::ByteData* bd = nullptr;
315 if (c.bytes && !c.bytes->empty())
316 bd = new eve::data::ByteData(c.bytes->data(), c.bytes->size());
317 args.push_back(Variant::makePtr(c.handle));
318 args.push_back(Variant::makePtr(bd));
319 args.push_back(Variant::makeString(c.peer));
320 ev->push(new Message("netdata", args));
321 break;
322 }
323 case NetEvType::Err: {
324 Channel* ch = channelFor(static_cast<TcpSocket*>(c.handle));
325 if (ch) {
326 args.push_back(Variant::makePtr(ch));
327 args.push_back(Variant::makeString(c.reason));
328 ev->push(new Message("chclose", args));
329 }
330 args.clear();
331 args.push_back(Variant::makePtr(c.handle));
332 args.push_back(Variant::makeString(c.reason));
333 ev->push(new Message("neterr", args));
334 break;
335 }
336 case NetEvType::HttpResp: {
337 eve::data::ByteData* bd = nullptr;
338 if (c.bytes && !c.bytes->empty())
339 bd = new eve::data::ByteData(c.bytes->data(), c.bytes->size());
340 args.push_back(Variant::makePtr(c.handle));
341 args.push_back(Variant::makeInt(c.status));
342 args.push_back(Variant::makePtr(bd));
343 ev->push(new Message("httpresp", args));
344 break;
345 }
346 case NetEvType::ChMsg: {
347 eve::data::ByteData* bd = nullptr;
348 if (c.bytes && !c.bytes->empty())
349 bd = new eve::data::ByteData(c.bytes->data(), c.bytes->size());
350 args.push_back(Variant::makePtr(c.handle));
351 args.push_back(Variant::makePtr(bd));
352 ev->push(new Message("chmsg", args));
353 break;
354 }
356 args.push_back(Variant::makePtr(c.handle));
357 args.push_back(Variant::makeString(c.reason));
358 ev->push(new Message("chclose", args));
359 break;
360 }
361}
362
364 std::vector<NetCompletion> batch;
365 if (worker_) worker_->drain(batch);
366 const int64_t now = std::chrono::duration_cast<std::chrono::milliseconds>(
367 std::chrono::steady_clock::now().time_since_epoch())
368 .count();
369 for (auto& c : batch) {
370 if (c.type == NetEvType::Data && c.kind == NetKind::Udp) {
371 auto* sock = static_cast<UdpSocket*>(c.handle);
372 auto hit = udpHosts_.find(sock);
373 if (hit != udpHosts_.end()) {
374 if (c.bytes) hit->second->onDatagram(*c.bytes, c.peer);
375 continue;
376 }
377 auto lit = udpLinks_.find(sock);
378 if (lit != udpLinks_.end()) {
379 if (c.bytes) lit->second->onDatagram(*c.bytes, c.peer);
380 continue;
381 }
382 }
383 emitCompletion(c);
384 }
385 for (auto& kv : udpHosts_) kv.second->pump(now);
386 for (auto& kv : udpLinks_) kv.second->pump(now);
387}
388
389void Network::expose(ssq::Table& table) {
390 auto cls = table.addClass(name, Network::create, false);
391 expose(cls);
392
393 auto tcp = table.addClass<TcpSocket>(
394 "TcpSocket", std::function<TcpSocket*()>([]() { return new TcpSocket(Network::create()); }), true);
395 tcp.addFunc("connect", &TcpSocket::connect);
396 tcp.addFunc("listen", &TcpSocket::listen);
397 tcp.addFunc("accept", &TcpSocket::accept);
398 tcp.addFunc("send", &TcpSocket::send);
399 tcp.addFunc("sendString", &TcpSocket::sendString);
400 tcp.addFunc("close", &TcpSocket::close);
401 tcp.addFunc("isConnected", &TcpSocket::isConnected);
402 tcp.addFunc("getPeer", &TcpSocket::getPeer);
403
404 auto udp = table.addClass<UdpSocket>(
405 "UdpSocket", std::function<UdpSocket*()>([]() { return new UdpSocket(Network::create()); }), true);
406 udp.addFunc("bind", &UdpSocket::bind);
407 udp.addFunc("connect", &UdpSocket::connect);
408 udp.addFunc("sendTo", &UdpSocket::sendTo);
409 udp.addFunc("sendToString", &UdpSocket::sendToString);
410 udp.addFunc("send", &UdpSocket::send);
411 udp.addFunc("sendString", &UdpSocket::sendString);
412 udp.addFunc("close", &UdpSocket::close);
413
414 auto http = table.addClass<HttpRequest>(
415 "HttpRequest",
416 std::function<HttpRequest*()>(
417 []() { return new HttpRequest(Network::create(), "GET", "http://127.0.0.1/"); }),
418 true);
419 http.addFunc("setHeader", &HttpRequest::setHeader);
420 http.addFunc("setBody", &HttpRequest::setBody);
421 http.addFunc("setBodyString", &HttpRequest::setBodyString);
422 http.addFunc("setTimeout", &HttpRequest::setTimeout);
423 http.addFunc("setVerifySsl", &HttpRequest::setVerifySsl);
424 http.addFunc("submit", &HttpRequest::submit);
425
426 auto ch = table.addClass<Channel>(
427 "Channel", std::function<Channel*()>([]() { return new Channel(nullptr); }), true);
428 ch.addFunc("sendMsg", &Channel::sendMsg);
429 ch.addFunc("sendMsgString", &Channel::sendMsgString);
430 ch.addFunc("getSocket", &Channel::getSocket);
431
432 auto sess = table.addClass<Session>(
433 "Session", std::function<Session*()>([]() { return new Session(); }), true);
434 sess.addFunc("add", &Session::add);
435 sess.addFunc("get", &Session::get);
436 sess.addFunc("remove", &Session::remove);
437 sess.addFunc("closeAll", &Session::closeAll);
438
439 auto writer = table.addClass<NetWriter>(
440 "NetWriter", std::function<NetWriter*()>([]() { return new NetWriter(); }), true);
441 writer.addFunc("writeU8", [](NetWriter* w, int64_t v) { w->writeU8(static_cast<uint8_t>(v)); });
442 writer.addFunc("writeI8", [](NetWriter* w, int64_t v) { w->writeI8(static_cast<int8_t>(v)); });
443 writer.addFunc("writeU16", [](NetWriter* w, int64_t v) { w->writeU16(static_cast<uint16_t>(v)); });
444 writer.addFunc("writeI16", [](NetWriter* w, int64_t v) { w->writeI16(static_cast<int16_t>(v)); });
445 writer.addFunc("writeU32", [](NetWriter* w, int64_t v) { w->writeU32(static_cast<uint32_t>(v)); });
446 writer.addFunc("writeI32", [](NetWriter* w, int64_t v) { w->writeI32(static_cast<int32_t>(v)); });
447 writer.addFunc("writeU64", [](NetWriter* w, int64_t v) { w->writeU64(static_cast<uint64_t>(v)); });
448 writer.addFunc("writeI64", [](NetWriter* w, int64_t v) { w->writeI64(static_cast<int64_t>(v)); });
449 writer.addFunc("writeF32", &NetWriter::writeF32);
450 writer.addFunc("writeF64", &NetWriter::writeF64);
451 writer.addFunc("writeBool", &NetWriter::writeBool);
452 writer.addFunc("writeString", &NetWriter::writeString);
453 writer.addFunc("writeBytes", [](NetWriter* w, eve::data::ByteData* d) {
454 if (d) w->writeBytes(d->getData(), d->getSize());
455 });
456 writer.addFunc("toString", [](NetWriter* w) { return w->toString(); });
457 writer.addFunc("size", [](NetWriter* w) { return static_cast<int64_t>(w->size()); });
458
459 auto reader = table.addClass<NetReader>(
460 "NetReader", std::function<NetReader*()>([]() { return new NetReader(); }), true);
461 reader.addFunc("init", [](NetReader* r, eve::data::ByteData* d) {
462 return d ? r->init(d->getData(), d->getSize()) : false;
463 });
464 reader.addFunc("initString", [](NetReader* r, const std::string& s) { return r->setBytes(s); });
465 reader.addFunc("u8", [](NetReader* r) { return static_cast<int64_t>(r->u8()); });
466 reader.addFunc("i8", [](NetReader* r) { return static_cast<int64_t>(r->i8()); });
467 reader.addFunc("u16", [](NetReader* r) { return static_cast<int64_t>(r->u16()); });
468 reader.addFunc("i16", [](NetReader* r) { return static_cast<int64_t>(r->i16()); });
469 reader.addFunc("u32", [](NetReader* r) { return static_cast<int64_t>(r->u32()); });
470 reader.addFunc("i32", [](NetReader* r) { return static_cast<int64_t>(r->i32()); });
471 reader.addFunc("u64", [](NetReader* r) { return static_cast<int64_t>(r->u64()); });
472 reader.addFunc("i64", [](NetReader* r) { return static_cast<int64_t>(r->i64()); });
473 reader.addFunc("f32", &NetReader::f32);
474 reader.addFunc("f64", &NetReader::f64);
475 reader.addFunc("bool", &NetReader::b);
476 reader.addFunc("str", [](NetReader* r) { return r->str(); });
477 reader.addFunc("bytes", [](NetReader* r, int64_t n) {
478 auto v = r->bytes(static_cast<size_t>(n));
479 return std::string(v.data(), v.size());
480 });
481 reader.addFunc("remaining", [](NetReader* r) { return static_cast<int64_t>(r->remaining()); });
482 reader.addFunc("pos", [](NetReader* r) { return static_cast<int64_t>(r->pos()); });
483 reader.addFunc("ok", [](NetReader* r) { return r->ok(); });
484
485 auto link = table.addClass<UdpLink>(
486 "UdpLink",
487 std::function<UdpLink*()>([]() { return new UdpLink(nullptr, nullptr); }), true);
488 link.addFunc("setRemote", &UdpLink::setRemote);
489 link.addFunc("setRemoteString", &UdpLink::setRemoteString);
490 link.addFunc("sendReliable", [](UdpLink* l, int64_t ch, const std::string& s) {
491 l->sendString(UdpLink::MsgType::Reliable, static_cast<uint8_t>(ch), s);
492 });
493 link.addFunc("sendUnreliable", [](UdpLink* l, int64_t ch, const std::string& s) {
494 l->sendString(UdpLink::MsgType::Unreliable, static_cast<uint8_t>(ch), s);
495 });
496 link.addFunc("sendOrdered", [](UdpLink* l, int64_t ch, const std::string& s) {
497 l->sendString(UdpLink::MsgType::UnreliableOrdered, static_cast<uint8_t>(ch), s);
498 });
499 link.addFunc("onMessage", [](UdpLink* l, ssq::Object fn) {
500 if (!l) return;
501 l->setMessageHandler(
502 [fn](UdpLink::MsgType, uint8_t ch, const char* d, size_t n) {
503 callScript2(fn, ch, std::string(d, n));
504 });
505 });
506 link.addFunc("setLossRate", &UdpLink::setLossRate);
507 link.addFunc("setTimeoutMs", &UdpLink::setTimeoutMs);
508 link.addFunc("isAlive", [](UdpLink* l) { return l && l->isAlive(); });
509 link.addFunc("peer", &UdpLink::peer);
510 link.addFunc("peerId", [](UdpLink* l) { return static_cast<int64_t>(l->peerId()); });
511 link.addFunc("pendingReliable",
512 [](UdpLink* l) { return static_cast<int64_t>(l->pendingReliable()); });
513 link.addFunc("pendingFragments",
514 [](UdpLink* l) { return static_cast<int64_t>(l->pendingFragments()); });
515
516 auto rpc = table.addClass<NetRpc>(
517 "NetRpc", std::function<NetRpc*()>([]() { return new NetRpc(nullptr); }), true);
518 rpc.addFunc("callRpc", [](NetRpc* r, int64_t msgId, const std::string& payload,
519 bool reliable) {
520 r->callString(static_cast<uint16_t>(msgId), payload, reliable);
521 });
522 rpc.addFunc("registerRpc", [](NetRpc* r, int64_t msgId, ssq::Object fn) {
523 r->registerScript(static_cast<uint16_t>(msgId), fn);
524 });
525
526 auto host = table.addClass<NetHost>(
527 "NetHost", std::function<NetHost*()>([]() { return new NetHost(nullptr); }), true);
528 host.addFunc("start", &NetHost::start);
529 host.addFunc("onMessage", [](NetHost* h, ssq::Object fn) {
530 if (!h) return;
531 h->setMessageHandler(
532 [fn](uint32_t peerId, UdpLink::MsgType, uint8_t ch, const char* d, size_t n) {
533 callScript3(fn, peerId, ch, std::string(d, n));
534 });
535 });
536 host.addFunc("onPeerConnected", [](NetHost* h, ssq::Object fn) {
537 if (!h) return;
538 h->setPeerConnectedHandler([fn](uint32_t id) { callScript2(fn, id, ""); });
539 });
540 host.addFunc("onPeerDisconnected", [](NetHost* h, ssq::Object fn) {
541 if (!h) return;
542 h->setPeerDisconnectedHandler([fn](uint32_t id) { callScript2(fn, id, ""); });
543 });
544 host.addFunc("sendReliable", [](NetHost* h, int64_t peerId, int64_t ch,
545 const std::string& s) {
546 h->sendStringTo(static_cast<uint32_t>(peerId), UdpLink::MsgType::Reliable,
547 static_cast<uint8_t>(ch), s);
548 });
549 host.addFunc("sendUnreliable", [](NetHost* h, int64_t peerId, int64_t ch,
550 const std::string& s) {
551 h->sendStringTo(static_cast<uint32_t>(peerId), UdpLink::MsgType::Unreliable,
552 static_cast<uint8_t>(ch), s);
553 });
554 host.addFunc("sendOrdered", [](NetHost* h, int64_t peerId, int64_t ch,
555 const std::string& s) {
556 h->sendStringTo(static_cast<uint32_t>(peerId), UdpLink::MsgType::UnreliableOrdered,
557 static_cast<uint8_t>(ch), s);
558 });
559 host.addFunc("link", &NetHost::linkByPeerId);
560 host.addFunc("peerCount", [](NetHost* h) { return static_cast<int64_t>(h->peerCount()); });
561 host.addFunc("setLossRate", &NetHost::setLossRate);
562 host.addFunc("setTimeoutMs", &NetHost::setTimeoutMs);
563}
564
565void Network::expose(ssq::Class& cls) {
566 cls.addFunc("getName", &Network::getName);
567 cls.addFunc("newTcp", &Network::newTcp);
568 cls.addFunc("newUdp", &Network::newUdp);
569 cls.addFunc("newHttp", &Network::newHttp);
570 cls.addFunc("newChannel", &Network::newChannel);
571 cls.addFunc("newSession", &Network::newSession);
572 cls.addFunc("newWriter", &Network::newWriter);
573 cls.addFunc("newReader", &Network::newReader);
574 cls.addFunc("newUdpLink", &Network::newUdpLink);
575 cls.addFunc("newRpc", &Network::newRpc);
576 cls.addFunc("newHost", &Network::newHost);
577 cls.addFunc("pump", &Network::pump);
578 cls.addFunc("setTimeout", &Network::setTimeout);
579 cls.addFunc("setVerifySsl", &Network::setVerifySsl);
580}
581
582} // namespace eve::network
struct SQVM * HSQUIRRELVM
HSQOBJECT cls
Definition ECS.cpp:21
glm::vec3 n
Definition Grass.cpp:64
int h
int w
uint32_t a
uint32_t b
uint32_t c
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
float f
const char * name
Definition RockMesh.cpp:21
SettlementPipeline::Stage fn
int d
int v
uint32_t s
Definition Weather.cpp:28
virtual std::string getName() const =0
In-memory byte buffer implementing eve::Data (ref-counted).
Definition ByteData.h:11
A named event carrying an ordered list of Variant payloads. Pushed messages are heap-allocated; the q...
Definition Event.h:56
Length-prefixed (big-endian uint32) message framing over a TcpSocket. sendMsg() writes one framed mes...
Definition Channel.h:21
bool sendMsg(eve::data::ByteData *data)
Sends one framed message.
Definition Channel.cpp:38
TcpSocket * getSocket() const
The underlying TCP socket, or nullptr.
Definition Channel.h:36
void feed(const std::vector< char > &bytes)
Feeds received bytes into the frame parser. Called on the main thread from Network::pump / the emitCo...
Definition Channel.cpp:65
bool sendMsgString(std::string s)
Sends a string payload as one framed message (empty strings are rejected).
Definition Channel.cpp:59
Asynchronous HTTP request (Poco-based). Configure headers/body, call submit(), then receive the respo...
Definition HttpRequest.h:24
void setBodyString(std::string s)
Sets the request body as a string.
void setTimeout(int ms)
Overrides the module default timeout for this request (ms).
void setBody(eve::data::ByteData *data)
Sets the request body bytes.
void setHeader(std::string k, std::string v)
Sets one request header.
bool submit()
Queues the request on the worker; true when accepted.
void setVerifySsl(bool verify)
Overrides TLS verification for this request.
void setLossRate(float rate)
Definition NetHost.cpp:33
bool start(uint16_t port)
Definition NetHost.cpp:21
void setTimeoutMs(int ms)
Definition NetHost.cpp:38
UdpLink * linkByPeerId(uint32_t peerId) const
Definition NetHost.cpp:76
void writeF32(float v)
Definition NetStream.cpp:87
void writeString(const std::string &s)
void writeF64(double v)
Definition NetStream.cpp:94
Network module: TCP/UDP/HTTP factories, background worker, and completion event plumbing....
Definition Network.h:30
NetHost * newHost()
Creates a UDP host (peer discovery / broadcast).
Definition Network.cpp:131
NetReader * newReader(std::string bytes)
Creates a streaming byte reader over a string buffer.
Definition Network.cpp:114
bool getVerifySsl() const
Definition Network.cpp:163
void setTimeout(int ms)
Default socket/HTTP timeout in milliseconds.
Definition Network.cpp:151
Session * newSession()
Creates a named-channel session container.
Definition Network.cpp:106
void watchTcp(TcpSocket *sock)
Internal: register/unregister sockets for pump polling.
Definition Network.cpp:175
void unbindUdpLink(UdpSocket *sock)
Definition Network.cpp:139
UdpLink * newUdpLink(UdpSocket *socket)
Creates a framed UDP link over a socket.
Definition Network.cpp:120
void unwatchUdp(UdpSocket *sock)
Definition Network.cpp:192
void setVerifySsl(bool verify)
Whether TLS peer certificates are verified (default true).
Definition Network.cpp:159
void bindChannel(TcpSocket *sock, Channel *ch)
Internal: bind a Channel to its socket (and reverse lookup).
Definition Network.cpp:197
HttpRequest * newHttp(std::string method, std::string url)
Creates a new HTTP request (method e.g. "GET"/"POST", full URL).
Definition Network.cpp:95
void bindUdpLink(UdpSocket *sock, UdpLink *link)
Definition Network.cpp:135
int getTimeout() const
Definition Network.cpp:155
~Network() override
Definition Network.cpp:82
void watchUdp(UdpSocket *sock)
Definition Network.cpp:186
void unbindUdpHost(UdpSocket *sock)
Definition Network.cpp:147
Channel * channelFor(TcpSocket *sock) const
Definition Network.cpp:207
NetRpc * newRpc(UdpLink *link)
Creates an RPC client over a UDP link.
Definition Network.cpp:127
void pump()
Drains worker completions and emits them as events; call per frame.
Definition Network.cpp:363
NetWriter * newWriter()
Creates a streaming byte writer.
Definition Network.cpp:110
UdpSocket * newUdp()
Creates a new UDP socket.
Definition Network.cpp:91
void pollSockets()
Internal: polls watched sockets; called from the NetWorker thread.
Definition Network.cpp:213
void drainForTest(std::vector< NetCompletion > &out)
Test helper: drains pending completions into out.
Definition Network.cpp:171
TcpSocket * newTcp()
Creates a new TCP socket (client or server).
Definition Network.cpp:87
void unwatchTcp(TcpSocket *sock)
Definition Network.cpp:181
void post(NetCompletion c)
Posts a completion to the worker queue (thread-safe).
Definition Network.cpp:167
void unbindChannel(TcpSocket *sock)
Definition Network.cpp:202
Channel * newChannel(TcpSocket *socket)
Creates a length-prefixed Channel over a TCP socket.
Definition Network.cpp:99
void bindUdpHost(UdpSocket *sock, NetHost *host)
Definition Network.cpp:143
Named collection of Channels (a "session"). Lookup by name, close all. Does not own the channels; the...
Definition Session.h:14
void remove(std::string name)
Removes a channel from the session (does not delete it).
Definition Session.cpp:20
void add(std::string name, Channel *ch)
Registers a channel under a name (replaces an existing entry).
Definition Session.cpp:11
void closeAll()
Closes every channel in the session.
Definition Session.cpp:24
Channel * get(std::string name)
Finds a channel by name, or nullptr.
Definition Session.cpp:15
TCP socket backed by Poco::Net; supports both client (connect) and server (listen/accept) roles....
Definition TcpSocket.h:28
void pushAccepted(std::unique_ptr< TcpSocket > sock)
Definition TcpSocket.cpp:43
bool listen(uint16_t port)
Starts listening on the given port; true on success.
bool sendString(std::string s)
Sends a string payload.
void close()
Closes the socket.
std::string getPeer() const
Remote peer address string, e.g. "1.2.3.4:5678".
TcpSocket * accept()
Accepts one pending client, or nullptr if none.
bool isConnected() const
True while a stream is connected.
bool connect(std::string host, uint16_t port)
Connects to host:port; true on success.
Definition TcpSocket.cpp:56
bool send(eve::data::ByteData *data)
Sends a framed byte payload; true when queued/accepted.
UDP socket backed by Poco::Net; supports connect/bind and datagram send.
Definition UdpSocket.h:24
bool sendTo(eve::data::ByteData *data, std::string host, uint16_t port)
Sends a datagram to an explicit host:port.
Definition UdpSocket.cpp:70
bool sendToString(std::string s, std::string host, uint16_t port)
Sends a string datagram to an explicit host:port.
Definition UdpSocket.cpp:94
void close()
Closes the socket.
bool bind(uint16_t port)
Binds to a local port; true on success.
Definition UdpSocket.cpp:22
bool sendString(std::string s)
Sends a string datagram to the connected peer.
bool connect(std::string host, uint16_t port)
Connects to a remote host:port (restricts send()).
Definition UdpSocket.cpp:47
bool send(eve::data::ByteData *data)
Sends a datagram to the connected peer.
void pushValue(HSQUIRRELVM vm, const eve::rx::Value &v)
Definition Rx.cpp:91
One asynchronous network result/event. handle points at the originating TcpSocket/UdpSocket/HttpReque...
Definition NetTypes.h:33