Shared task service

This commit is contained in:
KimLS
2019-06-09 18:39:32 -07:00
parent c1484a698c
commit b3a3d9bec5
23 changed files with 338 additions and 54 deletions
+2
View File
@@ -15,6 +15,7 @@ SET(world_sources
login_server_list.cpp
net.cpp
queryserv.cpp
router.cpp
shared_tasks.cpp
ucs.cpp
web_interface.cpp
@@ -43,6 +44,7 @@ SET(world_headers
login_server_list.h
net.h
queryserv.h
router.h
shared_tasks.h
sof_char_create_data.h
ucs.h
+8 -2
View File
@@ -84,6 +84,7 @@ union semun {
#include "web_interface.h"
#include "console.h"
#include "shared_tasks.h"
#include "router.h"
#include "../common/net/servertalk_server.h"
#include "../zone/data_bucket.h"
@@ -419,6 +420,7 @@ int main(int argc, char** argv) {
std::unique_ptr<EQ::Net::ServertalkServer> server_connection;
server_connection.reset(new EQ::Net::ServertalkServer());
Router router;
EQ::Net::ServertalkServerOptions server_opts;
server_opts.port = Config->WorldTCPPort;
server_opts.ipv6 = false;
@@ -502,14 +504,18 @@ int main(int argc, char** argv) {
web_interface.RemoveConnection(connection);
});
server_connection->OnConnectionIdentified([](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
server_connection->OnConnectionIdentified([&router](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
LogF(Logs::General, Logs::World_Server, "New connection from {0} with identifier {1}",
connection->GetUUID(), connection->GetIdentifier());
router.AddConnection(connection);
});
server_connection->OnConnectionRemoved([](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
server_connection->OnConnectionRemoved([&router](std::shared_ptr<EQ::Net::ServertalkServerConnection> connection) {
LogF(Logs::General, Logs::World_Server, "Removed connection from {0} with identifier {1}",
connection->GetUUID(), connection->GetIdentifier());
router.RemoveConnection(connection);
});
EQ::Net::EQStreamManagerOptions opts(9000, false, false);
+45
View File
@@ -0,0 +1,45 @@
#include "router.h"
Router::Router()
{
}
Router::~Router()
{
}
void Router::AddConnection(std::shared_ptr<EQ::Net::ServertalkServerConnection> connection)
{
m_connections.push_back(connection);
connection->OnMessage(ServerOP_RouteTo, std::bind(&Router::OnRouterMessage, this, std::placeholders::_1, std::placeholders::_2));
}
void Router::RemoveConnection(std::shared_ptr<EQ::Net::ServertalkServerConnection> connection)
{
auto iter = m_connections.begin();
while (iter != m_connections.end()) {
if ((*iter) == connection) {
m_connections.erase(iter);
return;
}
iter++;
}
}
void Router::OnRouterMessage(uint16 opcode, const EQ::Net::Packet &p)
{
auto idx = 0;
auto filter_length = p.GetInt32(idx); idx += sizeof(int32_t);
auto filter = p.GetString(idx, filter_length); idx += filter_length;
printf("Recv router msg of size %i\n", p.Length());
for (auto &connection : m_connections) {
auto identifier = connection->GetIdentifier();
auto pos = identifier.find(filter);
if (pos == 0) {
connection->Send(opcode, p);
}
}
}
+19
View File
@@ -0,0 +1,19 @@
#pragma once
#include "../common/net/servertalk_server_connection.h"
#include <memory>
#include <list>
class Router
{
public:
Router();
~Router();
void AddConnection(std::shared_ptr<EQ::Net::ServertalkServerConnection> connection);
void RemoveConnection(std::shared_ptr<EQ::Net::ServertalkServerConnection> connection);
private:
std::list<std::shared_ptr<EQ::Net::ServertalkServerConnection>> m_connections;
void OnRouterMessage(uint16 opcode, const EQ::Net::Packet &p);
};