Engine: strong optimizations for RCON system

- All serializations now expect exact buffer lengths (which we knew for every call, but didn't make use of).
- The prefix is now also constructed directly into the send buffer
- The send buffer copies have been completely removed, the data that has been rendered into the only existing buffer will be used directly.
This commit is contained in:
Kawe Mazidjatari 2025-02-09 01:23:05 +01:00
parent e223cec9c2
commit b1d81e2dc5
9 changed files with 77 additions and 59 deletions

View File

@ -50,7 +50,6 @@ public:
m_bValidated = false; m_bValidated = false;
m_bAuthorized = false; m_bAuthorized = false;
m_bInputOnly = true; m_bInputOnly = true;
m_RecvBuffer.resize(sizeof(u_long)); // Reserve enough for length-prefix.
} }
}; };

View File

@ -340,7 +340,7 @@ void EngineLoggerSink(LogType_t logType, LogLevel_t logLevel, eDLL_T context,
#ifndef CLIENT_DLL #ifndef CLIENT_DLL
if (!LoggedFromClient(context) && RCONServer()->ShouldSend(netcon::response_e::SERVERDATA_RESPONSE_CONSOLE_LOG)) if (!LoggedFromClient(context) && RCONServer()->ShouldSend(netcon::response_e::SERVERDATA_RESPONSE_CONSOLE_LOG))
{ {
RCONServer()->SendEncoded(formatted.c_str(), pszUpTime, netcon::response_e::SERVERDATA_RESPONSE_CONSOLE_LOG, RCONServer()->SendEncoded(formatted.c_str(), formatted.length(), pszUpTime, contextTextStartIndex, netcon::response_e::SERVERDATA_RESPONSE_CONSOLE_LOG,
int(context), int(logType)); int(context), int(logType));
} }
#endif // !CLIENT_DLL #endif // !CLIENT_DLL

View File

@ -162,11 +162,11 @@ void CRConClient::RequestConsoleLog(const bool bWantLog)
// sending logs will cause the print func to get called recursively forever. // sending logs will cause the print func to get called recursively forever.
Assert(!(bWantLog && IsRemoteLocal())); Assert(!(bWantLog && IsRemoteLocal()));
const char* szEnable = bWantLog ? "1" : "0"; const char* const szEnable = bWantLog ? "1" : "0";
const SocketHandle_t hSocket = GetSocket(); const SocketHandle_t hSocket = GetSocket();
vector<char> vecMsg; vector<char> vecMsg;
bool ret = Serialize(vecMsg, "", szEnable, netcon::request_e::SERVERDATA_REQUEST_SEND_CONSOLE_LOG); const bool ret = Serialize(vecMsg, "", 0, szEnable, 1, netcon::request_e::SERVERDATA_REQUEST_SEND_CONSOLE_LOG);
if (ret && !Send(hSocket, vecMsg.data(), int(vecMsg.size()))) if (ret && !Send(hSocket, vecMsg.data(), int(vecMsg.size())))
{ {
@ -177,14 +177,16 @@ void CRConClient::RequestConsoleLog(const bool bWantLog)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: serializes input // Purpose: serializes input
// Input : *svReqBuf - // Input : *svReqBuf -
// nReqMsgLen -
// *svReqVal - // *svReqVal -
// nReqValLen -
// request_t - // request_t -
// Output : serialized results as string // Output : serialized results as string
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool CRConClient::Serialize(vector<char>& vecBuf, const char* szReqBuf, bool CRConClient::Serialize(vector<char>& vecBuf, const char* szReqBuf, const size_t nReqMsgLen,
const char* szReqVal, const netcon::request_e requestType) const const char* szReqVal, const size_t nReqValLen, const netcon::request_e requestType) const
{ {
return NetconClient_Serialize(this, vecBuf, szReqBuf, szReqVal, requestType, return NetconClient_Serialize(this, vecBuf, szReqBuf, nReqMsgLen, szReqVal, nReqValLen, requestType,
rcon_encryptframes.GetBool(), rcon_debug.GetBool()); rcon_encryptframes.GetBool(), rcon_debug.GetBool());
} }
@ -329,7 +331,10 @@ static void RCON_CmdQuery_f(const CCommand& args)
{ {
if (argCount > 2) if (argCount > 2)
{ {
bSuccess = RCONClient()->Serialize(vecMsg, args.Arg(2), "", netcon::request_e::SERVERDATA_REQUEST_AUTH); const char* const pass = args.Arg(2);
const size_t passLen = strlen(pass);
bSuccess = RCONClient()->Serialize(vecMsg, pass, passLen, "", 0, netcon::request_e::SERVERDATA_REQUEST_AUTH);
} }
else // Need at least 3 arguments for a password in PASS command (rcon PASS <password>) else // Need at least 3 arguments for a password in PASS command (rcon PASS <password>)
{ {
@ -350,7 +355,13 @@ static void RCON_CmdQuery_f(const CCommand& args)
return; return;
} }
bSuccess = RCONClient()->Serialize(vecMsg, args.Arg(1), args.ArgS(), netcon::request_e::SERVERDATA_REQUEST_EXECCOMMAND); const char* const request = args.Arg(1);
const size_t requestLen = strlen(request);
const char* const value = args.ArgS();
const size_t valueLen = strlen(value);
bSuccess = RCONClient()->Serialize(vecMsg, request, requestLen, value, valueLen, netcon::request_e::SERVERDATA_REQUEST_EXECCOMMAND);
if (bSuccess) if (bSuccess)
{ {
RCONClient()->Send(hSocket, vecMsg.data(), int(vecMsg.size())); RCONClient()->Send(hSocket, vecMsg.data(), int(vecMsg.size()));

View File

@ -17,8 +17,8 @@ public:
virtual void Disconnect(const char* szReason = nullptr) override; virtual void Disconnect(const char* szReason = nullptr) override;
virtual bool ProcessMessage(const char* pMsgBuf, const int nMsgLen) override; virtual bool ProcessMessage(const char* pMsgBuf, const int nMsgLen) override;
bool Serialize(vector<char>& vecBuf, const char* szReqBuf, bool Serialize(vector<char>& vecBuf, const char* szReqBuf, const size_t nReqMsgLen,
const char* szReqVal, const netcon::request_e requestType) const; const char* szReqVal, const size_t nReqValLen, const netcon::request_e requestType) const;
void RequestConsoleLog(const bool bWantLog); void RequestConsoleLog(const bool bWantLog);
bool ShouldReceive(void); bool ShouldReceive(void);

View File

@ -252,7 +252,7 @@ void CRConServer::RunFrame(void)
if (CheckForBan(data)) if (CheckForBan(data))
{ {
SendEncoded(data.m_hSocket, s_BannedMessage, "", SendEncoded(data.m_hSocket, s_BannedMessage, sizeof(s_BannedMessage)-1, "", 0,
netcon::response_e::SERVERDATA_RESPONSE_AUTH, int(eDLL_T::NETCON)); netcon::response_e::SERVERDATA_RESPONSE_AUTH, int(eDLL_T::NETCON));
Disconnect("banned"); Disconnect("banned");
@ -272,23 +272,16 @@ void CRConServer::RunFrame(void)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool CRConServer::SendToAll(const char* pMsgBuf, const int nMsgLen) const bool CRConServer::SendToAll(const char* pMsgBuf, const int nMsgLen) const
{ {
ostringstream sendbuf; const int nCount = m_Socket.GetAcceptedSocketCount();
const u_long nLen = htonl(u_long(nMsgLen));
bool bSuccess = true; bool bSuccess = true;
sendbuf.write(reinterpret_cast<const char*>(&nLen), sizeof(u_long));
sendbuf.write(pMsgBuf, nMsgLen);
const int nCount = m_Socket.GetAcceptedSocketCount();
for (int i = nCount - 1; i >= 0; i--) for (int i = nCount - 1; i >= 0; i--)
{ {
const CConnectedNetConsoleData& data = m_Socket.GetAcceptedSocketData(i); const CConnectedNetConsoleData& data = m_Socket.GetAcceptedSocketData(i);
if (data.m_bAuthorized && !data.m_bInputOnly) if (data.m_bAuthorized && !data.m_bInputOnly)
{ {
int ret = ::send(data.m_hSocket, sendbuf.str().data(), const int ret = ::send(data.m_hSocket, pMsgBuf, nMsgLen, MSG_NOSIGNAL);
int(sendbuf.str().size()), MSG_NOSIGNAL);
if (ret == SOCKET_ERROR) if (ret == SOCKET_ERROR)
{ {
@ -306,17 +299,19 @@ bool CRConServer::SendToAll(const char* pMsgBuf, const int nMsgLen) const
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: encode and send message to all connected sockets // Purpose: encode and send message to all connected sockets
// Input : *pResponseMsg - // Input : *pResponseMsg -
// nResponseMsgLen -
// *pResponseVal - // *pResponseVal -
// nResponseValLen -
// responseType - // responseType -
// nMessageId - // nMessageId -
// nMessageType - // nMessageType -
// Output: true on success, false otherwise // Output: true on success, false otherwise
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool CRConServer::SendEncoded(const char* pResponseMsg, const char* pResponseVal, bool CRConServer::SendEncoded(const char* pResponseMsg, const size_t nResponseMsgLen, const char* pResponseVal, const size_t nResponseValLen,
const netcon::response_e responseType, const int nMessageId, const int nMessageType) const const netcon::response_e responseType, const int nMessageId, const int nMessageType) const
{ {
vector<char> vecMsg; vector<char> vecMsg;
if (!Serialize(vecMsg, pResponseMsg, pResponseVal, if (!Serialize(vecMsg, pResponseMsg, nResponseMsgLen, pResponseVal, nResponseValLen,
responseType, nMessageId, nMessageType)) responseType, nMessageId, nMessageType))
{ {
return false; return false;
@ -334,17 +329,20 @@ bool CRConServer::SendEncoded(const char* pResponseMsg, const char* pResponseVal
// Purpose: encode and send message to specific socket // Purpose: encode and send message to specific socket
// Input : hSocket - // Input : hSocket -
// *pResponseMsg - // *pResponseMsg -
// nResponseMsgLen -
// *pResponseVal - // *pResponseVal -
// nResponseValLen -
// responseType - // responseType -
// nMessageId - // nMessageId -
// nMessageType - // nMessageType -
// Output: true on success, false otherwise // Output: true on success, false otherwise
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool CRConServer::SendEncoded(const SocketHandle_t hSocket, const char* pResponseMsg, const char* pResponseVal, bool CRConServer::SendEncoded(const SocketHandle_t hSocket,
const char* pResponseMsg, const size_t nResponseMsgLen, const char* pResponseVal, const size_t nResponseValLen,
const netcon::response_e responseType, const int nMessageId, const int nMessageType) const const netcon::response_e responseType, const int nMessageId, const int nMessageType) const
{ {
vector<char> vecMsg; vector<char> vecMsg;
if (!Serialize(vecMsg, pResponseMsg, pResponseVal, if (!Serialize(vecMsg, pResponseMsg, nResponseMsgLen, pResponseVal, nResponseValLen,
responseType, nMessageId, nMessageType)) responseType, nMessageId, nMessageType))
{ {
return false; return false;
@ -362,16 +360,19 @@ bool CRConServer::SendEncoded(const SocketHandle_t hSocket, const char* pRespons
// Purpose: serializes input // Purpose: serializes input
// Input : &vecBuf - // Input : &vecBuf -
// *responseMsg - // *responseMsg -
// nResponseMsgLen -
// *responseVal - // *responseVal -
// nResponseValLen -
// responseType - // responseType -
// nMessageId - // nMessageId -
// nMessageType - // nMessageType -
// Output : serialized results as string // Output : serialized results as string
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool CRConServer::Serialize(vector<char>& vecBuf, const char* pResponseMsg, const char* pResponseVal, bool CRConServer::Serialize(vector<char>& vecBuf,
const char* pResponseMsg, const size_t nResponseMsgLen, const char* pResponseVal, const size_t nResponseValLen,
const netcon::response_e responseType, const int nMessageId, const int nMessageType) const const netcon::response_e responseType, const int nMessageId, const int nMessageType) const
{ {
return NetconServer_Serialize(this, vecBuf, pResponseMsg, pResponseVal, responseType, nMessageId, nMessageType, return NetconServer_Serialize(this, vecBuf, pResponseMsg, nResponseMsgLen, pResponseVal, nResponseValLen, responseType, nMessageId, nMessageType,
rcon_encryptframes.GetBool(), rcon_debug.GetBool()); rcon_encryptframes.GetBool(), rcon_debug.GetBool());
} }
@ -399,7 +400,7 @@ void CRConServer::Authenticate(const netcon::request& request, CConnectedNetCons
const char* pSendLogs = (!sv_rcon_sendlogs.GetBool() || data.m_bInputOnly) ? "0" : "1"; const char* pSendLogs = (!sv_rcon_sendlogs.GetBool() || data.m_bInputOnly) ? "0" : "1";
SendEncoded(data.m_hSocket, s_AuthMessage, pSendLogs, SendEncoded(data.m_hSocket, s_AuthMessage, sizeof(s_AuthMessage)-1, pSendLogs, 1,
netcon::response_e::SERVERDATA_RESPONSE_AUTH, static_cast<int>(eDLL_T::NETCON)); netcon::response_e::SERVERDATA_RESPONSE_AUTH, static_cast<int>(eDLL_T::NETCON));
} }
else // Bad password. else // Bad password.
@ -410,7 +411,7 @@ void CRConServer::Authenticate(const netcon::request& request, CConnectedNetCons
Msg(eDLL_T::SERVER, "Bad RCON password attempt from '%s'\n", netAdr.ToString()); Msg(eDLL_T::SERVER, "Bad RCON password attempt from '%s'\n", netAdr.ToString());
} }
SendEncoded(data.m_hSocket, s_WrongPwMessage, "", SendEncoded(data.m_hSocket, s_WrongPwMessage, sizeof(s_WrongPwMessage)-1, "", 0,
netcon::response_e::SERVERDATA_RESPONSE_AUTH, static_cast<int>(eDLL_T::NETCON)); netcon::response_e::SERVERDATA_RESPONSE_AUTH, static_cast<int>(eDLL_T::NETCON));
data.m_bAuthorized = false; data.m_bAuthorized = false;
@ -460,7 +461,7 @@ bool CRConServer::ProcessMessage(const char* pMsgBuf, const int nMsgLen)
request.requesttype() != netcon::request_e::SERVERDATA_REQUEST_AUTH) request.requesttype() != netcon::request_e::SERVERDATA_REQUEST_AUTH)
{ {
// Notify netconsole that authentication is required. // Notify netconsole that authentication is required.
SendEncoded(data.m_hSocket, s_NoAuthMessage, "", SendEncoded(data.m_hSocket, s_NoAuthMessage, sizeof(s_NoAuthMessage)-1, "", 0,
netcon::response_e::SERVERDATA_RESPONSE_AUTH, static_cast<int>(eDLL_T::NETCON)); netcon::response_e::SERVERDATA_RESPONSE_AUTH, static_cast<int>(eDLL_T::NETCON));
data.m_bValidated = false; data.m_bValidated = false;

View File

@ -25,19 +25,19 @@ public:
void Think(void); void Think(void);
void RunFrame(void); void RunFrame(void);
bool SendEncoded(const char* pResponseMsg, const char* pResponseVal, bool SendEncoded(const char* pResponseMsg, const size_t nResponseMsgLen, const char* pResponseVal, const size_t nResponseValLen,
const netcon::response_e responseType, const netcon::response_e responseType,
const int nMessageId = static_cast<int>(eDLL_T::NETCON), const int nMessageId = static_cast<int>(eDLL_T::NETCON),
const int nMessageType = static_cast<int>(LogType_t::LOG_NET)) const; const int nMessageType = static_cast<int>(LogType_t::LOG_NET)) const;
bool SendEncoded(const SocketHandle_t hSocket, const char* pResponseMsg, bool SendEncoded(const SocketHandle_t hSocket, const char* pResponseMsg, const size_t nResponseMsgLen,
const char* pResponseVal, const netcon::response_e responseType, const char* pResponseVal, const size_t nResponseValLen, const netcon::response_e responseType,
const int nMessageId = static_cast<int>(eDLL_T::NETCON), const int nMessageId = static_cast<int>(eDLL_T::NETCON),
const int nMessageType = static_cast<int>(LogType_t::LOG_NET)) const; const int nMessageType = static_cast<int>(LogType_t::LOG_NET)) const;
bool SendToAll(const char* pMsgBuf, const int nMsgLen) const; bool SendToAll(const char* pMsgBuf, const int nMsgLen) const;
bool Serialize(vector<char>& vecBuf, const char* pResponseMsg, const char* pResponseVal, const netcon::response_e responseType, bool Serialize(vector<char>& vecBuf, const char* pResponseMsg, const size_t nResponseMsgLen, const char* pResponseVal, const size_t nResponseValLen,
const int nMessageId = static_cast<int>(eDLL_T::NETCON), const int nMessageType = static_cast<int>(LogType_t::LOG_NET)) const; const netcon::response_e responseType, const int nMessageId = static_cast<int>(eDLL_T::NETCON), const int nMessageType = static_cast<int>(LogType_t::LOG_NET)) const;
void Authenticate(const netcon::request& request, CConnectedNetConsoleData& data); void Authenticate(const netcon::request& request, CConnectedNetConsoleData& data);
bool Comparator(const string& svPassword) const; bool Comparator(const string& svPassword) const;

View File

@ -148,6 +148,7 @@ bool CNetConBase::ProcessBuffer(CConnectedNetConsoleData& data,
const char* pRecvBuf, int nRecvLen, const int nMaxLen) const char* pRecvBuf, int nRecvLen, const int nMaxLen)
{ {
bool bSuccess = true; bool bSuccess = true;
byte prefix[sizeof(u_long)] = {};
while (nRecvLen > 0) while (nRecvLen > 0)
{ {
@ -173,18 +174,22 @@ bool CNetConBase::ProcessBuffer(CConnectedNetConsoleData& data,
data.m_nPayloadRead = 0; data.m_nPayloadRead = 0;
} }
} }
else if (data.m_nPayloadRead < sizeof(int)) // Read size field. else if (data.m_nPayloadRead < sizeof(u_long)) // Read size field.
{ {
data.m_RecvBuffer[data.m_nPayloadRead++] = *pRecvBuf; prefix[data.m_nPayloadRead++] = *pRecvBuf;
pRecvBuf++; pRecvBuf++;
nRecvLen--; nRecvLen--;
} }
else // Build prefix. else // Build prefix.
{ {
data.m_nPayloadLen = int(ntohl(*reinterpret_cast<u_long*>(&data.m_RecvBuffer[0]))); u_long* const pPrefix = reinterpret_cast<u_long*>(&prefix[0]);
data.m_nPayloadLen = int(ntohl(*pPrefix));
data.m_nPayloadRead = 0; data.m_nPayloadRead = 0;
*pPrefix = 0;
if (!data.m_bAuthorized && nMaxLen > -1) if (!data.m_bAuthorized && nMaxLen > -1)
{ {
if (data.m_nPayloadLen > nMaxLen) if (data.m_nPayloadLen > nMaxLen)
@ -281,15 +286,7 @@ bool CNetConBase::Decode(google::protobuf::MessageLite* pMsg,
bool CNetConBase::Send(const SocketHandle_t hSocket, const char* pMsgBuf, bool CNetConBase::Send(const SocketHandle_t hSocket, const char* pMsgBuf,
const int nMsgLen) const const int nMsgLen) const
{ {
std::ostringstream sendbuf; const int ret = ::send(hSocket, pMsgBuf, nMsgLen, MSG_NOSIGNAL);
const u_long nLen = htonl(u_long(nMsgLen));
sendbuf.write(reinterpret_cast<const char*>(&nLen), sizeof(u_long));
sendbuf.write(pMsgBuf, nMsgLen);
int ret = ::send(hSocket, sendbuf.str().data(), int(sendbuf.str().size()),
MSG_NOSIGNAL);
return (ret != SOCKET_ERROR); return (ret != SOCKET_ERROR);
} }

View File

@ -13,7 +13,9 @@
// Input : *pBase - // Input : *pBase -
// &vecBuf - // &vecBuf -
// *pResponseMsg - // *pResponseMsg -
// nResponseMsgLen -
// *pResponseVal - // *pResponseVal -
// nResponseValLen -
// responseType - // responseType -
// nMessageId - // nMessageId -
// nMessageType - // nMessageType -
@ -21,7 +23,8 @@
// bDebug - // bDebug -
// Output : true on success, false otherwise // Output : true on success, false otherwise
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool NetconServer_Serialize(const CNetConBase* pBase, vector<char>& vecBuf, const char* pResponseMsg, const char* pResponseVal, bool NetconServer_Serialize(const CNetConBase* pBase, vector<char>& vecBuf,
const char* pResponseMsg, const size_t nResponseMsgLen, const char* pResponseVal, const size_t nResponseValLen,
const netcon::response_e responseType, const int nMessageId, const int nMessageType, const bool bEncrypt, const bool bDebug) const netcon::response_e responseType, const int nMessageId, const int nMessageType, const bool bEncrypt, const bool bDebug)
{ {
netcon::response response; netcon::response response;
@ -29,8 +32,8 @@ bool NetconServer_Serialize(const CNetConBase* pBase, vector<char>& vecBuf, cons
response.set_messageid(nMessageId); response.set_messageid(nMessageId);
response.set_messagetype(nMessageType); response.set_messagetype(nMessageType);
response.set_responsetype(responseType); response.set_responsetype(responseType);
response.set_responsemsg(pResponseMsg); response.set_responsemsg(pResponseMsg, nResponseMsgLen);
response.set_responseval(pResponseVal); response.set_responseval(pResponseVal, nResponseValLen);
if (!NetconShared_PackEnvelope(pBase, vecBuf, response.ByteSizeLong(), &response, bEncrypt, bDebug)) if (!NetconShared_PackEnvelope(pBase, vecBuf, response.ByteSizeLong(), &response, bEncrypt, bDebug))
{ {
@ -45,21 +48,23 @@ bool NetconServer_Serialize(const CNetConBase* pBase, vector<char>& vecBuf, cons
// Input : *pBase - // Input : *pBase -
// &vecBuf - // &vecBuf -
// *szReqBuf - // *szReqBuf -
// nReqMsgLen -
// *szReqVal - // *szReqVal -
// nReqValLen -
// *requestType - // *requestType -
// bEncrypt - // bEncrypt -
// bDebug - // bDebug -
// Output : true on success, false otherwise // Output : true on success, false otherwise
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool NetconClient_Serialize(const CNetConBase* pBase, vector<char>& vecBuf, const char* szReqBuf, bool NetconClient_Serialize(const CNetConBase* pBase, vector<char>& vecBuf, const char* szReqBuf, const size_t nReqMsgLen,
const char* szReqVal, const netcon::request_e requestType, const bool bEncrypt, const bool bDebug) const char* szReqVal, const size_t nReqValLen, const netcon::request_e requestType, const bool bEncrypt, const bool bDebug)
{ {
netcon::request request; netcon::request request;
request.set_messageid(-1); request.set_messageid(-1);
request.set_requesttype(requestType); request.set_requesttype(requestType);
request.set_requestmsg(szReqBuf); request.set_requestmsg(szReqBuf, nReqMsgLen);
request.set_requestval(szReqVal); request.set_requestval(szReqVal, nReqValLen);
if (!NetconShared_PackEnvelope(pBase, vecBuf, request.ByteSizeLong(), &request, bEncrypt, bDebug)) if (!NetconShared_PackEnvelope(pBase, vecBuf, request.ByteSizeLong(), &request, bEncrypt, bDebug))
{ {
@ -169,9 +174,13 @@ bool NetconShared_PackEnvelope(const CNetConBase* pBase, vector<char>& outMsgBuf
envelope.set_data(dataBuf, nMsgLen); envelope.set_data(dataBuf, nMsgLen);
const size_t envelopeSize = envelope.ByteSizeLong(); const size_t envelopeSize = envelope.ByteSizeLong();
outMsgBuf.resize(envelopeSize); outMsgBuf.resize(envelopeSize + sizeof(u_long));
char* const scratch = outMsgBuf.data();
if (!pBase->Encode(&envelope, &outMsgBuf[0], envelopeSize)) // Write out frame size in network byte order.
*reinterpret_cast<u_long*>(scratch) = htonl(u_long(envelopeSize));
if (!pBase->Encode(&envelope, &scratch[sizeof(u_long)], envelopeSize))
{ {
if (bDebug) if (bDebug)
{ {

View File

@ -16,11 +16,12 @@ extern void RCON_InitClientAndTrySyncKeys();
#endif // !DEDICATED #endif // !DEDICATED
#endif // _TOOLS #endif // _TOOLS
bool NetconServer_Serialize(const CNetConBase* pBase, vector<char>& vecBuf, const char* pResponseMsg, const char* pResponseVal, bool NetconServer_Serialize(const CNetConBase* pBase, vector<char>& vecBuf,
const char* pResponseMsg, const size_t nResponseMsgLen, const char* pResponseVal, const size_t nResponseValLen,
const netcon::response_e responseType, const int nMessageId, const int nMessageType, const bool bEncrypt, const bool bDebug); const netcon::response_e responseType, const int nMessageId, const int nMessageType, const bool bEncrypt, const bool bDebug);
bool NetconClient_Serialize(const CNetConBase* pBase, vector<char>& vecBuf, const char* szReqBuf, bool NetconClient_Serialize(const CNetConBase* pBase, vector<char>& vecBuf, const char* szReqBuf, const size_t nReqMsgLen,
const char* szReqVal, const netcon::request_e requestType, const bool bEncrypt, const bool bDebug); const char* szReqVal, const size_t nReqValLen, const netcon::request_e requestType, const bool bEncrypt, const bool bDebug);
bool NetconClient_Connect(CNetConBase* pBase, const char* pHostAdr, const int nHostPort); bool NetconClient_Connect(CNetConBase* pBase, const char* pHostAdr, const int nHostPort);
bool NetconShared_PackEnvelope(const CNetConBase* pBase, vector<char>& outMsgBuf, const size_t nMsgLen, google::protobuf::MessageLite* inMsg, const bool bEncrypt, const bool bDebug); bool NetconShared_PackEnvelope(const CNetConBase* pBase, vector<char>& outMsgBuf, const size_t nMsgLen, google::protobuf::MessageLite* inMsg, const bool bEncrypt, const bool bDebug);