2025-05-05 23:22:43 +08:00
|
|
|
#ifndef REMOTE_SERVER_H
|
|
|
|
#define REMOTE_SERVER_H
|
|
|
|
|
2025-05-10 14:48:42 +08:00
|
|
|
#include <Communicate.h>
|
|
|
|
#include <InfoCommunicate.hpp>
|
|
|
|
|
2025-05-05 23:22:43 +08:00
|
|
|
#include <Util.h>
|
|
|
|
#include <array>
|
|
|
|
#include <chrono>
|
|
|
|
#include <cstdint>
|
2025-05-07 12:59:46 +08:00
|
|
|
#include <memory>
|
2025-05-05 23:22:43 +08:00
|
|
|
#include <shared_mutex>
|
|
|
|
#include <thread>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <wx/event.h>
|
|
|
|
#include <wx/evtloop.h>
|
|
|
|
#include <wx/socket.h>
|
|
|
|
#include <wx/wx.h>
|
|
|
|
|
2025-05-10 01:25:02 +08:00
|
|
|
// constexpr int gBufferSize = 1024 * 1024;
|
|
|
|
constexpr int gBufferSize = 256;
|
2025-05-05 23:22:43 +08:00
|
|
|
using highClock_t = std::chrono::time_point<std::chrono::high_resolution_clock>;
|
2025-05-10 14:48:42 +08:00
|
|
|
using sockPtr = std::shared_ptr<wxSocketBase>;
|
2025-05-05 23:22:43 +08:00
|
|
|
struct TranClient {
|
2025-05-10 14:48:42 +08:00
|
|
|
sockPtr wxSock;
|
2025-05-05 23:22:43 +08:00
|
|
|
MutBuffer buffer;
|
|
|
|
int64_t onlineTime;
|
2025-05-10 14:48:42 +08:00
|
|
|
std::string name;
|
2025-05-05 23:22:43 +08:00
|
|
|
highClock_t lastRecvTime;
|
2025-05-10 14:48:42 +08:00
|
|
|
std::array<char, gBufferSize> buf;
|
2025-05-05 23:22:43 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
class RemoteServer : public wxEvtHandler
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
RemoteServer();
|
|
|
|
|
|
|
|
public:
|
|
|
|
bool Init(const wxString& ip, unsigned short port);
|
|
|
|
int Run();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void OnServerEvent(wxSocketEvent& event);
|
|
|
|
void thClientThread(const std::shared_ptr<wxSocketBase>& wxSock, const wxString& id);
|
2025-05-10 14:48:42 +08:00
|
|
|
bool Forword(const sockPtr& wxSock, FrameBuffer* buf);
|
|
|
|
bool Reply(const sockPtr& wxSock, InfoCommunicate& info);
|
|
|
|
|
|
|
|
private:
|
|
|
|
bool RpyOnline(const sockPtr& wxSock);
|
|
|
|
bool RpyForwordFailed(const sockPtr& wxSock);
|
|
|
|
|
|
|
|
private:
|
|
|
|
template <typename T> bool Send(const sockPtr& wxSock, const T& info)
|
|
|
|
{
|
|
|
|
std::stringstream ss;
|
|
|
|
cereal::BinaryOutputArchive archive(ss);
|
|
|
|
archive(info);
|
|
|
|
|
|
|
|
auto buf = std::make_shared<FrameBuffer>();
|
|
|
|
buf->dataConst = ss.view().data();
|
|
|
|
buf->len = ss.str().size();
|
|
|
|
|
|
|
|
return Send(wxSock, buf.get());
|
|
|
|
}
|
|
|
|
bool Send(const sockPtr& wxSock, FrameBuffer* buf);
|
2025-05-05 23:22:43 +08:00
|
|
|
|
|
|
|
private:
|
2025-05-10 01:25:02 +08:00
|
|
|
bool thRun_{false};
|
2025-05-10 14:48:42 +08:00
|
|
|
std::string strID_;
|
2025-05-05 23:22:43 +08:00
|
|
|
wxWindowID serverId_;
|
|
|
|
std::shared_mutex clientsMutex_;
|
|
|
|
std::unique_ptr<wxSocketServer> server_;
|
|
|
|
std::unordered_map<wxString, std::thread> threads_;
|
|
|
|
std::unordered_map<wxString, std::shared_ptr<TranClient>> clients_;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // REMOTE_SERVER_H
|