76 lines
1.8 KiB
C++
76 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <f8/protoutils.h>
|
|
|
|
namespace a8
|
|
{
|
|
class TcpClient;
|
|
}
|
|
|
|
struct UpStreamMsgNode
|
|
{
|
|
unsigned short socket_handle = 0;
|
|
int msgid = 0;
|
|
::google::protobuf::Message* msg = nullptr;
|
|
f8::MsgHdr* hdr = nullptr;
|
|
|
|
UpStreamMsgNode* next_node = nullptr;
|
|
};
|
|
|
|
class UpStream
|
|
{
|
|
public:
|
|
int instance_id = 0;
|
|
std::string remote_ip;
|
|
int remote_port = 0;
|
|
a8::tick_t last_pong_tick = 0;
|
|
|
|
public:
|
|
void Init(int instance_id, const std::string& remote_ip, int remote_port);
|
|
void UnInit();
|
|
|
|
void Open();
|
|
void Close();
|
|
bool Connected();
|
|
|
|
template <typename T>
|
|
void SendMsg(int socket_handle, T& msg)
|
|
{
|
|
static int msgid = f8::Net_GetMessageId(msg);
|
|
if (Connected()) {
|
|
if (top_node_) {
|
|
SendStockMsg();
|
|
}
|
|
f8::Net_SendProxyCMsg(tcp_client_.get(), socket_handle, msgid, msg);
|
|
} else {
|
|
T* new_msg = new T();
|
|
*new_msg = msg;
|
|
AddStockMsg(socket_handle, msgid, new_msg, nullptr);
|
|
}
|
|
}
|
|
|
|
void SendStockMsg();
|
|
void ForwardClientMsg(f8::MsgHdr& hdr);
|
|
void ForwardClientMsgEx(f8::MsgHdr* hdr);
|
|
|
|
private:
|
|
void on_error(a8::TcpClient* sender, int errorId);
|
|
void on_connect(a8::TcpClient* sender);
|
|
void on_disconnect(a8::TcpClient* sender);
|
|
void on_socketread(a8::TcpClient* sender, char* buf, unsigned int len);
|
|
|
|
void CheckAlive();
|
|
void AddStockMsg(unsigned short socket_handle, int msgid, ::google::protobuf::Message* msg,
|
|
f8::MsgHdr* hdr);
|
|
|
|
private:
|
|
char *recv_buff_ = nullptr;
|
|
unsigned int recv_bufflen_ = 0;
|
|
std::shared_ptr<a8::TcpClient> tcp_client_;
|
|
f8::TimerWp timer_wp_;
|
|
f8::Attacher attacher_;
|
|
|
|
UpStreamMsgNode* top_node_ = nullptr;
|
|
UpStreamMsgNode* bot_node_ = nullptr;
|
|
};
|