From 6d7d86f1ae64b4ae3e5ac48be2b0ca8dad3df9a8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 3 May 2020 09:35:23 +0800 Subject: [PATCH] add IMListener --- server/imserver/IMListener.cc | 128 ++++++++++++++++++++++++++++++++++ server/imserver/IMListener.h | 39 +++++++++++ server/imserver/constant.h | 3 + 3 files changed, 170 insertions(+) create mode 100644 server/imserver/IMListener.cc create mode 100644 server/imserver/IMListener.h diff --git a/server/imserver/IMListener.cc b/server/imserver/IMListener.cc new file mode 100644 index 0000000..32b7f0a --- /dev/null +++ b/server/imserver/IMListener.cc @@ -0,0 +1,128 @@ +#include "precompile.h" + +#include +#include +#include + +#include "framework/cpp/netmsghandler.h" + +#include "app.h" +#include "IMListener.h" +#include "jsondatamgr.h" +#include "ss_proto.pb.h" +#include "handlermgr.h" + +class IMServerSession: public a8::MixedSession +{ +public: + + virtual void DecodeUserPacket(char* buf, int& offset, unsigned int buflen) override + { + //packagelen + msgid + magiccode + msgbody + //2 + 2 + 4+ xx + \0 + xx + bool warning = false; + while (buflen - offset >= sizeof(f8::PackHead)) { + f8::PackHead* p = (f8::PackHead*)&buf[offset]; + if (p->magic_code == f8::MAGIC_CODE) { + if (buflen - offset < sizeof(f8::PackHead) + p->packlen) { + break; + } + App::Instance()->AddSocketMsg(SF_IMServer, + socket_handle, + saddr, + p->msgid, + p->seqid, + &buf[offset + sizeof(f8::PackHead)], + p->packlen); + offset += sizeof(f8::PackHead) + p->packlen; + } else { + warning = true; + offset++; + continue; + } + } + + if (warning) { + a8::UdpLog::Instance()->Warning("收到imserver非法数据包", {}); + } + } + + virtual void OnRawHttpGet(const std::string& url, const std::string& querystr, + std::string& response) override + { + App::Instance()->AddIMMsg(IM_ExecGM, + a8::XParams() + .SetSender(socket_handle) + .SetParam1(url) + .SetParam2(querystr) + .SetParam3(saddr)); + } + + virtual void OnDisConnect() override + { + App::Instance()->AddIMMsg(IM_IMServerSocketDisconnect, + a8::XParams() + .SetSender(socket_handle) + .SetParam1(1)); + } + +}; + +static void CreateIMServerSocket(a8::TcpSession **p) +{ + *p = new IMServerSession(); +} + +static void GSListeneron_error(a8::TcpListener*, int type, int errorid) +{ + a8::UdpLog::Instance()->Debug("IMListeneron_error %d %d", {type, errorid}); +} + +void IMListener::Init() +{ + tcp_listener_ = new a8::TcpListener(); + tcp_listener_->on_create_client_socket = CreateIMServerSocket; + tcp_listener_->on_error = GSListeneron_error; + + tcp_listener_->bind_address = "0.0.0.0"; + tcp_listener_->bind_port = JsonDataMgr::Instance()->GetConf()->At("imserver_listen_port")->AsXValue(); + tcp_listener_->Open(); +} + +void IMListener::UnInit() +{ + delete tcp_listener_; + tcp_listener_ = nullptr; +} + +void IMListener::ForwardTargetConnMsg(f8::MsgHdr& hdr) +{ + char* buff = (char*)malloc(sizeof(f8::PackHead) + hdr.buflen); + f8::PackHead* head = (f8::PackHead*)buff; + head->packlen = hdr.buflen; + head->msgid = hdr.msgid; + head->seqid = hdr.seqid; + head->magic_code = f8::MAGIC_CODE; + head->ext_len = hdr.buflen >> 16; + if (hdr.buflen > 0) { + memmove(buff + sizeof(f8::PackHead), hdr.buf, hdr.buflen); + } + + tcp_listener_->SendClientMsg(hdr.socket_handle, buff, sizeof(f8::PackHead) + head->packlen); + free(buff); +} + +void IMListener::SendText(unsigned short sockhandle, const std::string& text) +{ + tcp_listener_->SendClientMsg(sockhandle, text.data(), text.size()); +} + +void IMListener::ForceCloseClient(unsigned short sockhandle) +{ + tcp_listener_->ForceCloseClient(sockhandle); +} + +void IMListener::MarkClient(unsigned short sockhandle, bool is_active) +{ + tcp_listener_->MarkClient(sockhandle, is_active); +} diff --git a/server/imserver/IMListener.h b/server/imserver/IMListener.h new file mode 100644 index 0000000..ad2ff6b --- /dev/null +++ b/server/imserver/IMListener.h @@ -0,0 +1,39 @@ +#pragma once + +//imserver listener +namespace a8 +{ + class TcpListener; +} + +class IMListener : public a8::Singleton +{ + private: + IMListener() {}; + friend class a8::Singleton; + + public: + enum { HID = HID_IMListener }; + + public: + void Init(); + void UnInit(); + + template + void SendMsg(unsigned short socket_handle, T& msg) + { + static int msgid = f8::Net_GetMessageId(msg); + f8::Net_SendMsg(tcp_listener_, socket_handle, 0, msgid, msg); + } + + void ForwardTargetConnMsg(f8::MsgHdr& hdr); + void SendText(unsigned short sockhandle, const std::string& text); + + void ForceCloseClient(unsigned short sockhandle); + void MarkClient(unsigned short sockhandle, bool is_active); + long long GetSendNodeNum(); + long long GetSentBytesNum(); + + private: + a8::TcpListener *tcp_listener_ = nullptr; +}; diff --git a/server/imserver/constant.h b/server/imserver/constant.h index c291d37..7874ef2 100644 --- a/server/imserver/constant.h +++ b/server/imserver/constant.h @@ -3,6 +3,7 @@ enum SocketFrom_e { SF_Client, + SF_IMServer, SF_TargetServer, SF_MasterServer, }; @@ -15,6 +16,7 @@ enum InnerMesssage_e IM_MasterSvrDisconnect, IM_TargetConnConnect, IM_TargetConnDisconnect, + IM_IMServerSocketDisConnect, }; //网络处理对象 @@ -22,6 +24,7 @@ enum NetHandler_e { HID_GCListener, HID_MasterSvrMgr, + HID_IMListener }; const char* const PROJ_NAME_FMT = "friend_imserver";