This commit is contained in:
aozhiwei 2019-09-15 13:49:05 +08:00
parent b2749cefb0
commit 53cbd7917a
6 changed files with 216 additions and 35 deletions

View File

@ -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<unsigned char> 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);
}

View File

@ -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<GCListener>
{
private:
@ -17,10 +33,11 @@ class GCListener : public a8::Singleton<GCListener>
void UnInit();
template <typename T>
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<GCListener>
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;
};

View File

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

View File

@ -28,3 +28,5 @@ class Global : public a8::Singleton<Global>
};
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);

View File

@ -3,5 +3,6 @@ package cs;
//id定义
enum CMMessageId_e
{
_SMAuthChallenge = 0x1EC;
_CMAuthSession = 0x1ED;
}

View File

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