From 5e6482a41ce0a1b4dbc82c2159daa2ca90701be5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 10 Aug 2018 13:56:59 +0800 Subject: [PATCH] add utils.* --- cpp/protoutils.cc | 39 +++++++++++++++++++----- cpp/protoutils.h | 41 +++++++++++++++++++++----- cpp/utils.cc | 75 +++++++++++++++++++++++++++++++++++++++++++++++ cpp/utils.h | 28 ++++++++++++++++++ 4 files changed, 168 insertions(+), 15 deletions(-) create mode 100644 cpp/utils.cc create mode 100644 cpp/utils.h diff --git a/cpp/protoutils.cc b/cpp/protoutils.cc index a6132ef..79c6483 100644 --- a/cpp/protoutils.cc +++ b/cpp/protoutils.cc @@ -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; +} diff --git a/cpp/protoutils.h b/cpp/protoutils.h index 81f388f..8060cac 100644 --- a/cpp/protoutils.h +++ b/cpp/protoutils.h @@ -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); diff --git a/cpp/utils.cc b/cpp/utils.cc new file mode 100644 index 0000000..22138fe --- /dev/null +++ b/cpp/utils.cc @@ -0,0 +1,75 @@ +#include + +#include +#include + +#include + +#include "utils.h" + + +bool ReadCsvMetaFile(const std::string& filename, + google::protobuf::Message* prototype, + std::function 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; +} diff --git a/cpp/utils.h b/cpp/utils.h new file mode 100644 index 0000000..db2ba9c --- /dev/null +++ b/cpp/utils.h @@ -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 push_back_func); + +template +bool ReadCsvMetaFile(const std::string& filename, std::list& meta_list) +{ + T dummy; + return ReadCsvMetaFile(filename, + &dummy, + [&meta_list] (google::protobuf::Message* msg) + { + T t; + t.CopyFrom(*msg); + meta_list.emplace_back(t); + }); +}