From 53cbd7917a175c340c2db57b7b0bd60d7ce73552 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 15 Sep 2019 13:49:05 +0800 Subject: [PATCH] 1 --- server/gameserver/GCListener.cc | 68 +++++------ server/gameserver/GCListener.h | 24 +++- server/gameserver/global.cc | 151 +++++++++++++++++++++++++ server/gameserver/global.h | 2 + server/tools/protobuild/cs_msgid.proto | 1 + server/tools/protobuild/cs_proto.proto | 5 + 6 files changed, 216 insertions(+), 35 deletions(-) diff --git a/server/gameserver/GCListener.cc b/server/gameserver/GCListener.cc index 7ad4156..91548fb 100644 --- a/server/gameserver/GCListener.cc +++ b/server/gameserver/GCListener.cc @@ -10,35 +10,13 @@ #include "GCListener.h" #include "jsondatamgr.h" #include "handlermgr.h" +#include "cs_proto.pb.h" +#include "cs_msgid.pb.h" const static size_t CRYPTED_SEND_LEN = 4; const static size_t CRYPTED_RECV_LEN = 6; -#if defined( __GNUC__ ) -#pragma pack(1) -#else -#pragma pack(push,1) -#endif - -struct ServerPktHeader -{ - unsigned short size; - unsigned short cmd; -}; - -struct ClientPktHeader -{ - unsigned short size; - unsigned int cmd; -}; - -#if defined( __GNUC__ ) -#pragma pack() -#else -#pragma pack(pop) -#endif - -class GGClientSession: public a8::MixedSession +class GCClientSession: public a8::MixedSession { public: @@ -133,13 +111,17 @@ public: virtual void OnConnect() override { - int SMSG_AUTH_CHALLENGE = 0x1EC; - ServerPktHeader header; - header.cmd = SMSG_AUTH_CHALLENGE; - unsigned short len = 4 + 2; - header.size = (len << 8) + (len >> 8); - SendBuff((char*)&header, sizeof(ServerPktHeader)); - SendBuff((char*)&seed_, sizeof(seed_)); + cs::SMAuthChallenge msg; + msg.set_seed(seed_); + unsigned short packlen = 2 + CustomPbSerializeSize(&msg); + + char* buff = (char*)malloc(sizeof(ServerPktHeader) + packlen); + ServerPktHeader* head = (ServerPktHeader*)buff; + head->cmd = cs::_SMAuthChallenge; + head->size = (packlen << 8) + (packlen >> 8); + CustomPbSerialize(buff + sizeof(ServerPktHeader), packlen, &msg); + SendBuff(buff, sizeof(ServerPktHeader) + packlen); + free(buff); } virtual void OnDisConnect() override @@ -150,6 +132,14 @@ public: .SetParam1(1)); } +protected: + + virtual void SendBuff(const char* buff, unsigned int bufflen) override + { + EncryptSend((unsigned char*)buff, bufflen); + a8::MixedSession::SendBuff(buff, bufflen); + } + private: unsigned int seed_ = 0; std::vector key_; @@ -162,7 +152,7 @@ private: static void CreateGameClientSocket(a8::TcpSession **p) { - *p = new GGClientSession(); + *p = new GCClientSession(); } static void GSListeneron_error(a8::TcpListener*, int type, int errorid) @@ -206,3 +196,15 @@ void GCListener::MarkClient(int sockhandle, bool is_active) { tcp_listener_->MarkClient(sockhandle, is_active); } + +void GCListener::InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg) +{ + unsigned short packlen = 2 + CustomPbSerializeSize(&msg); + char* buff = (char*)malloc(sizeof(ServerPktHeader) + packlen); + ServerPktHeader* head = (ServerPktHeader*)buff; + head->cmd = msgid; + head->size = (packlen << 8) + (packlen >> 8); + CustomPbSerialize(buff + sizeof(ServerPktHeader), packlen, &msg); + tcp_listener_->SendClientMsg(socket_handle, buff, sizeof(ServerPktHeader) + packlen); + free(buff); +} diff --git a/server/gameserver/GCListener.h b/server/gameserver/GCListener.h index 2cab5b6..ac14209 100644 --- a/server/gameserver/GCListener.h +++ b/server/gameserver/GCListener.h @@ -6,6 +6,22 @@ namespace a8 class TcpListener; } +#pragma pack(1) + +struct ServerPktHeader +{ + unsigned short size; + unsigned short cmd; +}; + +struct ClientPktHeader +{ + unsigned short size; + unsigned int cmd; +}; + +#pragma pack() + class GCListener : public a8::Singleton { private: @@ -17,10 +33,11 @@ class GCListener : public a8::Singleton void UnInit(); template - void SendMsg(int sockhandle, T& msg) + void SendMsg(int socket_handle, T& msg) { static int msgid = f8::Net_GetMessageId(msg); - f8::Net_SendMsg(tcp_listener_, sockhandle, 0, msgid, msg); + + InternalSendMsg(socket_handle, msgid, msg); } void SendText(int sockhandle, const std::string& text); @@ -28,6 +45,9 @@ class GCListener : public a8::Singleton void ForceCloseClient(int sockhandle); void MarkClient(int sockhandle, bool is_active); + private: + void InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg); + private: a8::TcpListener *tcp_listener_ = nullptr; }; diff --git a/server/gameserver/global.cc b/server/gameserver/global.cc index 440c3df..5846572 100755 --- a/server/gameserver/global.cc +++ b/server/gameserver/global.cc @@ -117,3 +117,154 @@ bool CustomParser(f8::MsgHdr& hdr, google::protobuf::Message* msg) } return true; } + +bool CustomPbSerialize(char* buf, int buflen, google::protobuf::Message* msg) +{ + const google::protobuf::Descriptor* descriptor = msg->GetDescriptor(); + const google::protobuf::Reflection* reflection = msg->GetReflection(); + + int offset = 0; + for (int i = 0; i < descriptor->field_count(); ++i) { + const google::protobuf::FieldDescriptor* field_desc = descriptor->field(i); + switch (field_desc->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: + { + std::string val = reflection->GetString(*msg, field_desc); + int fixed_len = field_desc->options().GetExtension(cs::fixed_len); + if (field_desc->type() == google::protobuf::FieldDescriptor::TYPE_BYTES && fixed_len > 0) { + if (offset + fixed_len > buflen) { + abort(); + } + memmove(buf + offset, val.data(), val.size()); + offset += fixed_len; + } else { + if (offset + val.size() + 1 > (size_t)buflen) { + abort(); + } + memmove(buf + offset, val.data(), val.size()); + offset += val.size() + 1; + buf[offset - 1] = '\0'; + } + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: + { + if (offset + sizeof(int) > (size_t)buflen) { + abort(); + } + int val = reflection->GetInt32(*msg, field_desc); + memmove(buf + offset, &val, sizeof(val)); + offset += sizeof(val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: + { + if (offset + sizeof(unsigned int) > (size_t)buflen) { + abort(); + } + unsigned int val = reflection->GetUInt32(*msg, field_desc); + memmove(buf + offset, &val, sizeof(val)); + offset += sizeof(val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: + { + if (offset + sizeof(long long) > (size_t)buflen) { + abort(); + } + long long val = reflection->GetUInt64(*msg, field_desc); + memmove(buf + offset, &val, sizeof(val)); + offset += sizeof(val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: + { + if (offset + sizeof(unsigned long long) > (size_t)buflen) { + abort(); + } + unsigned long long val = reflection->GetUInt64(*msg, field_desc); + memmove(buf + offset, &val, sizeof(val)); + offset += sizeof(val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: + { + if (offset + sizeof(float) > (size_t)buflen) { + abort(); + } + float val = reflection->GetFloat(*msg, field_desc); + memmove(buf + offset, &val, sizeof(val)); + offset += sizeof(val); + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: + { + if (offset + sizeof(double) > (size_t)buflen) { + abort(); + } + double val = reflection->GetFloat(*msg, field_desc); + memmove(buf + offset, &val, sizeof(val)); + offset += sizeof(val); + } + break; + default: + { + abort(); + } + break; + }//end switch + } + return true; +} + +int CustomPbSerializeSize(google::protobuf::Message* msg) +{ + int byte_size = 0; + const google::protobuf::Descriptor* descriptor = msg->GetDescriptor(); + const google::protobuf::Reflection* reflection = msg->GetReflection(); + + for (int i = 0; i < descriptor->field_count(); ++i) { + const google::protobuf::FieldDescriptor* field_desc = descriptor->field(i); + switch (field_desc->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: + { + std::string val = reflection->GetString(*msg, field_desc); + int fixed_len = field_desc->options().GetExtension(cs::fixed_len); + if (field_desc->type() == google::protobuf::FieldDescriptor::TYPE_BYTES && fixed_len > 0) { + byte_size += fixed_len; + } else { + byte_size += val.size() + 1; + } + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: + { + byte_size += 4; + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: + { + byte_size += 8; + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: + { + byte_size += 4; + } + break; + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: + { + byte_size += 8; + } + break; + default: + { + abort(); + } + break; + }//end switch + } + return byte_size; +} diff --git a/server/gameserver/global.h b/server/gameserver/global.h index 7eea48b..2626f87 100755 --- a/server/gameserver/global.h +++ b/server/gameserver/global.h @@ -28,3 +28,5 @@ class Global : public a8::Singleton }; bool CustomParser(f8::MsgHdr& hdr, google::protobuf::Message* msg); +bool CustomPbSerialize(char* buf, int buflen, google::protobuf::Message* msg); +int CustomPbSerializeSize(google::protobuf::Message* msg); diff --git a/server/tools/protobuild/cs_msgid.proto b/server/tools/protobuild/cs_msgid.proto index 9d2ba1e..6c82728 100644 --- a/server/tools/protobuild/cs_msgid.proto +++ b/server/tools/protobuild/cs_msgid.proto @@ -3,5 +3,6 @@ package cs; //消息id定义 enum CMMessageId_e { + _SMAuthChallenge = 0x1EC; _CMAuthSession = 0x1ED; } diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 9648047..ea7152b 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -6,6 +6,11 @@ extend google.protobuf.FieldOptions { optional int32 fixed_len = 51234 [default = 0]; } +message SMAuthChallenge +{ + optional uint32 seed = 1; +} + message CMAuthSession { optional uint32 built_number_client = 1;