add IMListener

This commit is contained in:
aozhiwei 2020-05-03 09:35:23 +08:00
parent 0c214177a4
commit 6d7d86f1ae
3 changed files with 170 additions and 0 deletions

View File

@ -0,0 +1,128 @@
#include "precompile.h"
#include <google/protobuf/message.h>
#include <a8/mixedsession.h>
#include <a8/tcplistener.h>
#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);
}

View File

@ -0,0 +1,39 @@
#pragma once
//imserver listener
namespace a8
{
class TcpListener;
}
class IMListener : public a8::Singleton<IMListener>
{
private:
IMListener() {};
friend class a8::Singleton<IMListener>;
public:
enum { HID = HID_IMListener };
public:
void Init();
void UnInit();
template <typename T>
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;
};

View File

@ -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";