#pragma once #include "framework/cpp/protoutils.h" namespace a8 { class TcpClient; class AsyncTcpClient; } struct TargetConnMsgNode { unsigned short socket_handle = 0; int msgid = 0; ::google::protobuf::Message* msg = nullptr; f8::MsgHdr* hdr = nullptr; TargetConnMsgNode* next_node = nullptr; }; struct timer_list; class TargetConn { 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 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_, 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: #if ASYNC_TCPCLIENT && GAME_ID == 2002 void on_error(a8::AsyncTcpClient* sender, int errorId); void on_connect(a8::AsyncTcpClient* sender); void on_disconnect(a8::AsyncTcpClient* sender); void on_socketread(a8::AsyncTcpClient* sender, char* buf, unsigned int len); #else 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); #endif 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; #if ASYNC_TCPCLIENT && GAME_ID == 2002 a8::AsyncTcpClient* tcp_client_ = nullptr; #else a8::TcpClient* tcp_client_ = nullptr; #endif timer_list* timer_ = nullptr; TargetConnMsgNode* top_node_ = nullptr; TargetConnMsgNode* bot_node_ = nullptr; };