1
This commit is contained in:
parent
b2749cefb0
commit
53cbd7917a
@ -10,35 +10,13 @@
|
|||||||
#include "GCListener.h"
|
#include "GCListener.h"
|
||||||
#include "jsondatamgr.h"
|
#include "jsondatamgr.h"
|
||||||
#include "handlermgr.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_SEND_LEN = 4;
|
||||||
const static size_t CRYPTED_RECV_LEN = 6;
|
const static size_t CRYPTED_RECV_LEN = 6;
|
||||||
|
|
||||||
#if defined( __GNUC__ )
|
class GCClientSession: public a8::MixedSession
|
||||||
#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
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -133,13 +111,17 @@ public:
|
|||||||
|
|
||||||
virtual void OnConnect() override
|
virtual void OnConnect() override
|
||||||
{
|
{
|
||||||
int SMSG_AUTH_CHALLENGE = 0x1EC;
|
cs::SMAuthChallenge msg;
|
||||||
ServerPktHeader header;
|
msg.set_seed(seed_);
|
||||||
header.cmd = SMSG_AUTH_CHALLENGE;
|
unsigned short packlen = 2 + CustomPbSerializeSize(&msg);
|
||||||
unsigned short len = 4 + 2;
|
|
||||||
header.size = (len << 8) + (len >> 8);
|
char* buff = (char*)malloc(sizeof(ServerPktHeader) + packlen);
|
||||||
SendBuff((char*)&header, sizeof(ServerPktHeader));
|
ServerPktHeader* head = (ServerPktHeader*)buff;
|
||||||
SendBuff((char*)&seed_, sizeof(seed_));
|
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
|
virtual void OnDisConnect() override
|
||||||
@ -150,6 +132,14 @@ public:
|
|||||||
.SetParam1(1));
|
.SetParam1(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual void SendBuff(const char* buff, unsigned int bufflen) override
|
||||||
|
{
|
||||||
|
EncryptSend((unsigned char*)buff, bufflen);
|
||||||
|
a8::MixedSession::SendBuff(buff, bufflen);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
unsigned int seed_ = 0;
|
unsigned int seed_ = 0;
|
||||||
std::vector<unsigned char> key_;
|
std::vector<unsigned char> key_;
|
||||||
@ -162,7 +152,7 @@ private:
|
|||||||
|
|
||||||
static void CreateGameClientSocket(a8::TcpSession **p)
|
static void CreateGameClientSocket(a8::TcpSession **p)
|
||||||
{
|
{
|
||||||
*p = new GGClientSession();
|
*p = new GCClientSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GSListeneron_error(a8::TcpListener*, int type, int errorid)
|
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);
|
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);
|
||||||
|
}
|
||||||
|
@ -6,6 +6,22 @@ namespace a8
|
|||||||
class TcpListener;
|
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>
|
class GCListener : public a8::Singleton<GCListener>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -17,10 +33,11 @@ class GCListener : public a8::Singleton<GCListener>
|
|||||||
void UnInit();
|
void UnInit();
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void SendMsg(int sockhandle, T& msg)
|
void SendMsg(int socket_handle, T& msg)
|
||||||
{
|
{
|
||||||
static int msgid = f8::Net_GetMessageId(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);
|
void SendText(int sockhandle, const std::string& text);
|
||||||
@ -28,6 +45,9 @@ class GCListener : public a8::Singleton<GCListener>
|
|||||||
void ForceCloseClient(int sockhandle);
|
void ForceCloseClient(int sockhandle);
|
||||||
void MarkClient(int sockhandle, bool is_active);
|
void MarkClient(int sockhandle, bool is_active);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void InternalSendMsg(int socket_handle, int msgid, google::protobuf::Message& msg);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
a8::TcpListener *tcp_listener_ = nullptr;
|
a8::TcpListener *tcp_listener_ = nullptr;
|
||||||
};
|
};
|
||||||
|
@ -117,3 +117,154 @@ bool CustomParser(f8::MsgHdr& hdr, google::protobuf::Message* msg)
|
|||||||
}
|
}
|
||||||
return true;
|
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;
|
||||||
|
}
|
||||||
|
@ -28,3 +28,5 @@ class Global : public a8::Singleton<Global>
|
|||||||
};
|
};
|
||||||
|
|
||||||
bool CustomParser(f8::MsgHdr& hdr, google::protobuf::Message* msg);
|
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);
|
||||||
|
@ -3,5 +3,6 @@ package cs;
|
|||||||
//消息id定义
|
//消息id定义
|
||||||
enum CMMessageId_e
|
enum CMMessageId_e
|
||||||
{
|
{
|
||||||
|
_SMAuthChallenge = 0x1EC;
|
||||||
_CMAuthSession = 0x1ED;
|
_CMAuthSession = 0x1ED;
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,11 @@ extend google.protobuf.FieldOptions {
|
|||||||
optional int32 fixed_len = 51234 [default = 0];
|
optional int32 fixed_len = 51234 [default = 0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message SMAuthChallenge
|
||||||
|
{
|
||||||
|
optional uint32 seed = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message CMAuthSession
|
message CMAuthSession
|
||||||
{
|
{
|
||||||
optional uint32 built_number_client = 1;
|
optional uint32 built_number_client = 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user