1
This commit is contained in:
parent
b2749cefb0
commit
53cbd7917a
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -3,5 +3,6 @@ package cs;
|
||||
//消息id定义
|
||||
enum CMMessageId_e
|
||||
{
|
||||
_SMAuthChallenge = 0x1EC;
|
||||
_CMAuthSession = 0x1ED;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user