载入中...
搜索中...
未找到
NetHost.cpp
浏览该文件的文档.
1#include "network/NetHost.h"
2#include "network/Network.h"
3#include "network/UdpSocket.h"
4#include "data/ByteData.h"
5#include "event/Event.h"
6
7namespace eve::network {
8
9NetHost::NetHost(Network* net) : net_(net) {}
10
12 if (net_ && sock_) net_->unbindUdpHost(sock_);
13 for (UdpLink* l : owned_) delete l;
14 owned_.clear();
15 byAddr_.clear();
16 byId_.clear();
17 delete sock_;
18 sock_ = nullptr;
19}
20
21bool NetHost::start(uint16_t port) {
22 if (!net_ || sock_) return false;
23 sock_ = net_->newUdp();
24 if (!sock_ || !sock_->bind(port)) {
25 delete sock_;
26 sock_ = nullptr;
27 return false;
28 }
29 net_->bindUdpHost(sock_, this);
30 return true;
31}
32
33void NetHost::setLossRate(float rate) {
34 lossRate_ = rate;
35 for (auto& kv : byId_) kv.second->setLossRate(rate);
36}
37
39 timeoutMs_ = ms;
40 for (auto& kv : byId_) kv.second->setTimeoutMs(ms);
41}
42
43void NetHost::onDatagram(const std::vector<char>& bytes, const std::string& from) {
44 auto it = byAddr_.find(from);
45 if (it != byAddr_.end()) {
46 it->second->onDatagram(bytes, from);
47 return;
48 }
49
50 auto* link = new UdpLink(net_, sock_);
51 link->setRemoteString(from);
52 const uint32_t id = nextPeerId_++;
53 link->setPeerId(id);
54 link->setLossRate(lossRate_);
55 link->setTimeoutMs(timeoutMs_);
56 link->setMessageHandler(
57 [this, id](UdpLink::MsgType t, uint8_t ch, const char* d, size_t n) {
58 if (onMessage_) onMessage_(id, t, ch, d, n);
59 });
60 link->setDisconnectHandler([this, id](const std::string&) {
61 pendingRemove_.push_back(id);
62 });
63 byAddr_[from] = link;
64 byId_[id] = link;
65 owned_.push_back(link);
66 emitPeerConnected(id);
67 link->onDatagram(bytes, from);
68}
69
70void NetHost::pump(int64_t nowMs) {
71 pendingRemove_.clear();
72 for (auto& kv : byId_) kv.second->pump(nowMs);
73 for (uint32_t id : pendingRemove_) emitPeerDisconnected(id);
74}
75
76UdpLink* NetHost::linkByPeerId(uint32_t peerId) const {
77 auto it = byId_.find(peerId);
78 return it == byId_.end() ? nullptr : it->second;
79}
80
81void NetHost::sendTo(uint32_t peerId, UdpLink::MsgType type, uint8_t channel,
82 const void* data, size_t n) {
83 UdpLink* link = linkByPeerId(peerId);
84 if (link) link->send(type, channel, data, n);
85}
86
87bool NetHost::sendStringTo(uint32_t peerId, UdpLink::MsgType type, uint8_t channel,
88 const std::string& s) {
89 UdpLink* link = linkByPeerId(peerId);
90 return link && link->sendString(type, channel, s);
91}
92
93void NetHost::emitPeerConnected(uint32_t peerId) {
94 if (onConnect_) onConnect_(peerId);
95 if (net_) {
96 auto* ev = eve::ModuleManager::getInstance<eve::event::Event>("Event");
97 if (ev) {
98 std::vector<eve::event::Variant> args;
99 args.push_back(eve::event::Variant::makeInt(peerId));
100 ev->push(new eve::event::Message("peerconn", args));
101 }
102 }
103}
104
105void NetHost::emitPeerDisconnected(uint32_t peerId) {
106 auto it = byId_.find(peerId);
107 if (it == byId_.end()) return; // already removed
108 UdpLink* link = it->second;
109 byId_.erase(it);
110 for (auto a = byAddr_.begin(); a != byAddr_.end(); ++a) {
111 if (a->second == link) {
112 byAddr_.erase(a);
113 break;
114 }
115 }
116 if (onDisconnect_) onDisconnect_(peerId);
117 if (net_) {
118 auto* ev = eve::ModuleManager::getInstance<eve::event::Event>("Event");
119 if (ev) {
120 std::vector<eve::event::Variant> args;
121 args.push_back(eve::event::Variant::makeInt(peerId));
122 ev->push(new eve::event::Message("peerdisconn", args));
123 }
124 }
125}
126
127} // namespace eve::network
std::string type
std::string id
glm::vec3 n
Definition Grass.cpp:64
uint32_t a
Light2D::Data * data
int d
uint32_t s
Definition Weather.cpp:28
A named event carrying an ordered list of Variant payloads. Pushed messages are heap-allocated; the q...
Definition Event.h:56
bool sendStringTo(uint32_t peerId, UdpLink::MsgType type, uint8_t channel, const std::string &s)
Definition NetHost.cpp:87
void setLossRate(float rate)
Definition NetHost.cpp:33
void onDatagram(const std::vector< char > &bytes, const std::string &from)
Definition NetHost.cpp:43
void pump(int64_t nowMs)
Definition NetHost.cpp:70
bool start(uint16_t port)
Definition NetHost.cpp:21
void sendTo(uint32_t peerId, UdpLink::MsgType type, uint8_t channel, const void *data, size_t n)
Definition NetHost.cpp:81
void setTimeoutMs(int ms)
Definition NetHost.cpp:38
NetHost(Network *net)
Definition NetHost.cpp:9
UdpLink * linkByPeerId(uint32_t peerId) const
Definition NetHost.cpp:76
Network module: TCP/UDP/HTTP factories, background worker, and completion event plumbing....
Definition Network.h:30
void unbindUdpHost(UdpSocket *sock)
Definition Network.cpp:147
UdpSocket * newUdp()
Creates a new UDP socket.
Definition Network.cpp:91
void bindUdpHost(UdpSocket *sock, NetHost *host)
Definition Network.cpp:143
bool bind(uint16_t port)
Binds to a local port; true on success.
Definition UdpSocket.cpp:22
static Variant makeInt(int64_t v)
Constructs an integer variant.
Definition Event.h:29