Skip to content

Commit 79c10fe

Browse files
committed
Tcp/Udp服务器支持单线程模式
1 parent 5144e2a commit 79c10fe

File tree

4 files changed

+57
-45
lines changed

4 files changed

+57
-45
lines changed

src/Network/TcpServer.cpp

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ INSTANCE_IMP(SessionMap)
2020
StatisticImp(TcpServer)
2121

2222
TcpServer::TcpServer(const EventPoller::Ptr &poller) : Server(poller) {
23+
_multi_poller = !poller;
2324
setOnCreateSocket(nullptr);
2425
}
2526

@@ -82,7 +83,7 @@ TcpServer::Ptr TcpServer::onCreatServer(const EventPoller::Ptr &poller) {
8283
Socket::Ptr TcpServer::onBeforeAcceptConnection(const EventPoller::Ptr &poller) {
8384
assert(_poller->isCurrentThread());
8485
//此处改成自定义获取poller对象,防止负载不均衡
85-
return createSocket(EventPollerPool::Instance().getPoller(false));
86+
return createSocket(_multi_poller ? EventPollerPool::Instance().getPoller(false) : _poller);
8687
}
8788

8889
void TcpServer::cloneFrom(const TcpServer &that) {
@@ -191,19 +192,21 @@ void TcpServer::start_l(uint16_t port, const std::string &host, uint32_t backlog
191192
return true;
192193
}, _poller);
193194

194-
EventPollerPool::Instance().for_each([&](const TaskExecutor::Ptr &executor) {
195-
EventPoller::Ptr poller = static_pointer_cast<EventPoller>(executor);
196-
if (poller == _poller) {
197-
return;
198-
}
199-
auto &serverRef = _cloned_server[poller.get()];
200-
if (!serverRef) {
201-
serverRef = onCreatServer(poller);
202-
}
203-
if (serverRef) {
204-
serverRef->cloneFrom(*this);
205-
}
206-
});
195+
if (_multi_poller) {
196+
EventPollerPool::Instance().for_each([&](const TaskExecutor::Ptr &executor) {
197+
EventPoller::Ptr poller = static_pointer_cast<EventPoller>(executor);
198+
if (poller == _poller) {
199+
return;
200+
}
201+
auto &serverRef = _cloned_server[poller.get()];
202+
if (!serverRef) {
203+
serverRef = onCreatServer(poller);
204+
}
205+
if (serverRef) {
206+
serverRef->cloneFrom(*this);
207+
}
208+
});
209+
}
207210

208211
if (!_socket->listen(port, host.c_str(), backlog)) {
209212
// 创建tcp监听失败,可能是由于端口占用或权限问题

src/Network/TcpServer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class TcpServer : public Server {
9292
void setupEvent();
9393

9494
private:
95+
bool _multi_poller;
9596
bool _is_on_manager = false;
9697
bool _main_server = true;
9798
std::weak_ptr<TcpServer> _parent;

src/Network/UdpServer.cpp

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ static UdpServer::PeerIdType makeSockId(sockaddr *addr, int) {
4545
}
4646

4747
UdpServer::UdpServer(const EventPoller::Ptr &poller) : Server(poller) {
48+
_multi_poller = !poller;
4849
setOnCreateSocket(nullptr);
4950
}
5051

@@ -87,20 +88,22 @@ void UdpServer::start_l(uint16_t port, const std::string &host) {
8788
return false;
8889
}, _poller);
8990

90-
//clone server至不同线程,让udp server支持多线程
91-
EventPollerPool::Instance().for_each([&](const TaskExecutor::Ptr &executor) {
92-
auto poller = std::static_pointer_cast<EventPoller>(executor);
93-
if (poller == _poller) {
94-
return;
95-
}
96-
auto &serverRef = _cloned_server[poller.get()];
97-
if (!serverRef) {
98-
serverRef = onCreatServer(poller);
99-
}
100-
if (serverRef) {
101-
serverRef->cloneFrom(*this);
102-
}
103-
});
91+
if (_multi_poller) {
92+
// clone server至不同线程,让udp server支持多线程
93+
EventPollerPool::Instance().for_each([&](const TaskExecutor::Ptr &executor) {
94+
auto poller = std::static_pointer_cast<EventPoller>(executor);
95+
if (poller == _poller) {
96+
return;
97+
}
98+
auto &serverRef = _cloned_server[poller.get()];
99+
if (!serverRef) {
100+
serverRef = onCreatServer(poller);
101+
}
102+
if (serverRef) {
103+
serverRef->cloneFrom(*this);
104+
}
105+
});
106+
}
104107

105108
if (!_socket->bindUdpSock(port, host.c_str())) {
106109
// udp 绑定端口失败, 可能是由于端口占用或权限问题
@@ -193,24 +196,28 @@ void UdpServer::onManagerSession() {
193196
//拷贝map,防止遍历时移除对象
194197
copy_map = std::make_shared<std::unordered_map<PeerIdType, SessionHelper::Ptr> >(*_session_map);
195198
}
196-
EventPollerPool::Instance().for_each([copy_map](const TaskExecutor::Ptr &executor) {
197-
auto poller = std::static_pointer_cast<EventPoller>(executor);
198-
poller->async([copy_map]() {
199-
for (auto &pr : *copy_map) {
200-
auto &session = pr.second->session();
201-
if (!session->getPoller()->isCurrentThread()) {
202-
//该session不归属该poller管理
203-
continue;
204-
}
205-
try {
206-
// UDP 会话需要处理超时
207-
session->onManager();
208-
} catch (exception &ex) {
209-
WarnL << "Exception occurred when emit onManager: " << ex.what();
210-
}
199+
auto lam = [copy_map]() {
200+
for (auto &pr : *copy_map) {
201+
auto &session = pr.second->session();
202+
if (!session->getPoller()->isCurrentThread()) {
203+
// 该session不归属该poller管理
204+
continue;
211205
}
206+
try {
207+
// UDP 会话需要处理超时
208+
session->onManager();
209+
} catch (exception &ex) {
210+
WarnL << "Exception occurred when emit onManager: " << ex.what();
211+
}
212+
}
213+
};
214+
if (_multi_poller){
215+
EventPollerPool::Instance().for_each([lam](const TaskExecutor::Ptr &executor) {
216+
std::static_pointer_cast<EventPoller>(executor)->async(lam);
212217
});
213-
});
218+
} else {
219+
lam();
220+
}
214221
}
215222

216223
SessionHelper::Ptr UdpServer::getOrCreateSession(const UdpServer::PeerIdType &id, const Buffer::Ptr &buf, sockaddr *addr, int addr_len, bool &is_new) {
@@ -228,7 +235,7 @@ SessionHelper::Ptr UdpServer::getOrCreateSession(const UdpServer::PeerIdType &id
228235

229236
SessionHelper::Ptr UdpServer::createSession(const PeerIdType &id, const Buffer::Ptr &buf, struct sockaddr *addr, int addr_len) {
230237
// 此处改成自定义获取poller对象,防止负载不均衡
231-
auto socket = createSocket(EventPollerPool::Instance().getPoller(false), buf, addr, addr_len);
238+
auto socket = createSocket(_multi_poller ? EventPollerPool::Instance().getPoller(false) : _poller, buf, addr, addr_len);
232239
if (!socket) {
233240
//创建socket失败,本次onRead事件收到的数据直接丢弃
234241
return nullptr;

src/Network/UdpServer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ class UdpServer : public Server {
108108

109109
private:
110110
bool _cloned = false;
111+
bool _multi_poller;
111112
Socket::Ptr _socket;
112113
std::shared_ptr<Timer> _timer;
113114
onCreateSocket _on_create_socket;

0 commit comments

Comments
 (0)