add utils.*

This commit is contained in:
aozhiwei 2018-08-10 13:56:59 +08:00
parent c4f3714a97
commit 5e6482a41c
4 changed files with 168 additions and 15 deletions

View File

@ -24,9 +24,9 @@ int Net_GetMessageId(::google::protobuf::Message& msg)
}
std::string msgid_enum_name;
if (msgname[0] == 'C' && msgname[1] == 'M') {
msgid_enum_name = "kingsomevs.CMMessageId_e";
msgid_enum_name = "cs.CMMessageId_e";
} else if (msgname[0] == 'S' && msgname[1] == 'M') {
msgid_enum_name = "kingsomevs.SMMessageId_e";
msgid_enum_name = "cs.SMMessageId_e";
} else if (msgname[0] == 'S' && msgname[1] == 'S') {
msgid_enum_name = "ss.SSMessageId_e";
} else {
@ -59,11 +59,11 @@ void Net_PackMsg(unsigned short msgid, ::google::protobuf::Message& msg, std::st
PackHead* head = (PackHead*)buff;
head->packlen = packlen;
head->msgid = msgid;
head->magiccode = MAGIC_CODE;
head->magic_code = MAGIC_CODE;
msg.SerializeToArray(buff + sizeof(PackHead), packlen);
}
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned short msgid, ::google::protobuf::Message& msg)
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned seqid, unsigned short msgid, ::google::protobuf::Message& msg)
{
int packlen = msg.ByteSize();
@ -71,14 +71,15 @@ int Net_SendMsg(a8::TcpClient* tcp_client, unsigned short msgid, ::google::proto
PackHead* head = (PackHead*)buff;
head->packlen = packlen;
head->msgid = msgid;
head->magiccode = MAGIC_CODE;
head->seqid = seqid;
head->magic_code = MAGIC_CODE;
msg.SerializeToArray(buff + sizeof(PackHead), packlen);
tcp_client->SendBuff(buff, sizeof(PackHead) + packlen);
free(buff);
return sizeof(PackHead) + packlen;
}
int Net_SendMsg(a8::TcpListener* tcp_listener, unsigned short socket_handle,
int Net_SendMsg(a8::TcpListener* tcp_listener, unsigned short socket_handle, unsigned int seqid,
unsigned short msgid, ::google::protobuf::Message& msg)
{
int packlen = msg.ByteSize();
@ -87,9 +88,33 @@ int Net_SendMsg(a8::TcpListener* tcp_listener, unsigned short socket_handle,
PackHead* head = (PackHead*)buff;
head->packlen = packlen;
head->msgid = msgid;
head->magiccode = MAGIC_CODE;
head->seqid = seqid;
head->magic_code = MAGIC_CODE;
msg.SerializeToArray(buff + sizeof(PackHead), packlen);
tcp_listener->SendClientMsg(socket_handle, buff, sizeof(PackHead) + packlen);
free(buff);
return sizeof(PackHead) + packlen;
}
int Net_SendProxyMsg(a8::TcpListener* tcp_listener, int socket_handle, unsigned int seqid, unsigned short error_code,
unsigned short msgid, ::google::protobuf::Message& msg)
{
unsigned short parent_socket_handle = (socket_handle >> 16) & 0xFFFF;
unsigned short child_socket_handle = socket_handle & 0xFFFF;
int packlen = msg.ByteSize();
char* buff = (char*)malloc(sizeof(WSProxyPackHead_S) + packlen);
WSProxyPackHead_S* head = (WSProxyPackHead_S*)buff;
head->packlen = packlen;
head->msgid = msgid;
head->seqid = seqid;
head->magic_code = MAGIC_CODE;
head->rpc_error_code = error_code;
head->socket_handle = child_socket_handle;
msg.SerializeToArray(buff + sizeof(WSProxyPackHead_S), packlen);
tcp_listener->SendClientMsg(parent_socket_handle, buff, sizeof(WSProxyPackHead_S) + packlen);
free(buff);
return sizeof(WSProxyPackHead_S) + packlen;
}

View File

@ -1,12 +1,13 @@
#ifndef COMMON_PROTOUTILS_H
#define COMMON_PROTOUTILS_H
#pragma once
//普通消息头部
struct PackHead
{
unsigned short packlen;
unsigned short msgid;
unsigned int magiccode;
unsigned int seqid;
unsigned short magic_code;
unsigned short rpc_error_code;
};
//转发类消息头部
@ -21,6 +22,28 @@ struct ForwardPackHead
unsigned int sign;
};
struct WSProxyPackHead_C
{
unsigned short packlen;
unsigned short msgid;
unsigned int seqid;
unsigned short magic_code;
unsigned short socket_handle;
unsigned long ip_saddr;
};
struct WSProxyPackHead_S
{
unsigned short packlen;
unsigned short msgid;
unsigned int seqid;
unsigned short magic_code;
unsigned short rpc_error_code;
unsigned short socket_handle;
};
class Player;
struct MsgHdr
{
@ -35,7 +58,7 @@ struct MsgHdr
const void* user_data = nullptr;
};
const unsigned int MAGIC_CODE = 0xAABBCCAA;
const unsigned short MAGIC_CODE = (((unsigned short)'S') << 8) | ((unsigned short)'K');
namespace google
{
@ -54,10 +77,12 @@ namespace a8
int Net_GetMessageId(::google::protobuf::Message& msg);
void Net_PackMsg(unsigned short msgid, ::google::protobuf::Message& msg, std::string& out);
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned short msgid, ::google::protobuf::Message& msg);
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned short msgid,
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned int seqid,
unsigned short msgid, ::google::protobuf::Message& msg);
int Net_SendMsg(a8::TcpClient* tcp_client, unsigned int seqid, unsigned short msgid,
const char* msgbody, int msgbody_len);
int Net_SendMsg(a8::TcpListener* tcp_tlistener, unsigned short socket_handle,
int Net_SendMsg(a8::TcpListener* tcp_tlistener, unsigned short socket_handle, unsigned int seqid,
unsigned short msgid, ::google::protobuf::Message& msg);
#endif
int Net_SendProxyMsg(a8::TcpListener* tcp_tlistener, int socket_handle, unsigned int seqid, unsigned short error_code,
unsigned short msgid, ::google::protobuf::Message& msg);

75
cpp/utils.cc Normal file
View File

@ -0,0 +1,75 @@
#include <a8/a8.h>
#include <a8/stringlist.h>
#include <a8/csvreader.h>
#include <google/protobuf/message.h>
#include "utils.h"
bool ReadCsvMetaFile(const std::string& filename,
google::protobuf::Message* prototype,
std::function<void (google::protobuf::Message*)> push_back_func)
{
const google::protobuf::Descriptor* descriptor = prototype->GetDescriptor();
const google::protobuf::Reflection* reflection = prototype->GetReflection();
a8::CsvReader reader;
reader.Load(filename);
while (reader.NextLine()) {
google::protobuf::Message* msg = prototype->New();
for (int i = 0; i < descriptor->field_count(); ++i) {
const google::protobuf::FieldDescriptor* field_desc = descriptor->field(i);
const std::string& field_name = field_desc->name();
switch (field_desc->cpp_type()) {
case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
{
reflection->SetString(msg, field_desc, reader.GetValue(field_name));
}
break;
case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
{
reflection->SetInt32(msg, field_desc, reader.GetValue(field_name));
}
break;
case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
{
reflection->SetUInt32(msg, field_desc, reader.GetValue(field_name));
}
break;
case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
{
reflection->SetInt64(msg, field_desc, reader.GetValue(field_name));
}
break;
case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
{
reflection->SetUInt64(msg, field_desc, reader.GetValue(field_name));
}
break;
case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
{
reflection->SetFloat(msg, field_desc, (double)reader.GetValue(field_name));
}
break;
case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
{
reflection->SetDouble(msg, field_desc, reader.GetValue(field_name));
}
break;
default:
{
abort();
}
break;
}//end switch
push_back_func(msg);
delete msg;
}//end for
}
return true;
}

28
cpp/utils.h Normal file
View File

@ -0,0 +1,28 @@
#pragma once
namespace google
{
namespace protobuf
{
class Descriptor;
class Message;
}
}
bool ReadCsvMetaFile(const std::string& filename,
google::protobuf::Message* prototype,
std::function<void (google::protobuf::Message*)> push_back_func);
template <typename T>
bool ReadCsvMetaFile(const std::string& filename, std::list<T>& meta_list)
{
T dummy;
return ReadCsvMetaFile(filename,
&dummy,
[&meta_list] (google::protobuf::Message* msg)
{
T t;
t.CopyFrom(*msg);
meta_list.emplace_back(t);
});
}