diff --git a/server/robotserver/app.cc b/server/robotserver/app.cc index d138e06..b5daa02 100755 --- a/server/robotserver/app.cc +++ b/server/robotserver/app.cc @@ -295,7 +295,7 @@ void App::DispatchMsg() hdr.offset = 0; hdr.ip_saddr = pdelnode->ip_saddr; switch (pdelnode->sockfrom) { - case SF_GameGate: + case SF_VirtualClient: { ProcessGameGateMsg(hdr); } @@ -356,7 +356,7 @@ void App::ProcessIMMsg() delete param; } break; - case IM_ClientSocketDisconnect: + case IM_VirtualClientDisconnect: { #if 0 PlayerMgr::Instance()->OnClientDisconnect(pdelnode->params); diff --git a/server/robotserver/constant.h b/server/robotserver/constant.h index 9fb76aa..ac3df34 100755 --- a/server/robotserver/constant.h +++ b/server/robotserver/constant.h @@ -2,12 +2,12 @@ enum SocketFrom_e { - SF_GameGate, + SF_VirtualClient, }; enum InnerMesssage_e { - IM_ClientSocketDisconnect = 100, + IM_VirtualClientDisconnect = 100, IM_PlayerOffline, IM_ExecGM, IM_DBSConnDisconnect, diff --git a/server/robotserver/virtualclient.cc b/server/robotserver/virtualclient.cc new file mode 100644 index 0000000..ee47283 --- /dev/null +++ b/server/robotserver/virtualclient.cc @@ -0,0 +1,103 @@ +#include "precompile.h" + +#include + +#include + +#include "virtualclient.h" +#include "app.h" + +const int PACK_MAX = 1024 * 64; + +void VirtualClient::Init() +{ + recv_bufflen_ = 0; + recv_buff_ = (char*) malloc(PACK_MAX * 2); + + tcp_client_ = new a8::TcpClient(); + tcp_client_->remote_address = remote_ip; + tcp_client_->remote_port = remote_port; + tcp_client_->on_error = std::bind(&VirtualClient::on_error, this, std::placeholders::_1, std::placeholders::_2); + tcp_client_->on_connect = std::bind(&VirtualClient::on_connect, this, std::placeholders::_1); + tcp_client_->on_disconnect = std::bind(&VirtualClient::on_disconnect, this, std::placeholders::_1); + tcp_client_->on_socketread = std::bind(&VirtualClient::on_socketread, this ,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); +} + +void VirtualClient::UnInit() +{ + delete tcp_client_; + tcp_client_ = nullptr; +} + +void VirtualClient::Update() +{ + +} + +void VirtualClient::on_error(a8::TcpClient* sender, int errorId) +{ + a8::UdpLog::Instance()->Error("VirtualClient errorid=%d", {errorId}); +} + +void VirtualClient::on_connect(a8::TcpClient* sender) +{ + recv_bufflen_ = 0; + a8::UdpLog::Instance()->Info("target server connected", {}); + App::Instance()->AddIMMsg(IM_VirtualClientDisconnect, + a8::XParams() + .SetSender(instance_id) + ); +} + +void VirtualClient::on_disconnect(a8::TcpClient* sender) +{ + recv_bufflen_ = 0; + a8::UdpLog::Instance()->Info("target server %d disconnected after 10s later reconnect", {instance_id}); + App::Instance()->AddIMMsg(IM_VirtualClientDisconnect, + a8::XParams() + .SetSender(instance_id) + ); +} + +void VirtualClient::on_socketread(a8::TcpClient* sender, char* buf, unsigned int len) +{ + if (recv_bufflen_ + len > 2 * PACK_MAX) { + recv_bufflen_ = 0; + a8::UdpLog::Instance()->Debug("recvied target server too long message", {}); + return; + } else { + memmove(&recv_buff_[recv_bufflen_], buf, len); + recv_bufflen_ += len; + } + + bool warning = false; + unsigned int offset = 0; + while (recv_bufflen_ - offset >= sizeof(f8::WSProxyPackHead_S)) { + f8::WSProxyPackHead_S* p = (f8::WSProxyPackHead_S*) &recv_buff_[offset]; + if (p->magic_code == f8::MAGIC_CODE) { + if (recv_bufflen_ - offset < sizeof(f8::WSProxyPackHead_S) + p->packlen) { + break; + } + App::Instance()->AddSocketMsg(SF_VirtualClient, + p->socket_handle, + instance_id, + p->msgid, + p->seqid, + &recv_buff_[offset + sizeof(f8::WSProxyPackHead_S)], + p->packlen); + offset += sizeof(f8::WSProxyPackHead_S) + p->packlen; + } else { + warning = true; + offset++; + continue; + } + } + + if (warning) { + a8::UdpLog::Instance()->Debug("recvied bad package", {}); + } + if (offset > 0 && offset < recv_bufflen_) { + memmove(recv_buff_, recv_buff_ + offset, recv_bufflen_ - offset); + } + recv_bufflen_ -= offset; +} diff --git a/server/robotserver/virtualclient.h b/server/robotserver/virtualclient.h new file mode 100644 index 0000000..cecdc73 --- /dev/null +++ b/server/robotserver/virtualclient.h @@ -0,0 +1,31 @@ +#pragma once + +namespace a8 +{ + class TcpClient; +} + +class VirtualClient +{ + public: + int instance_id = 0; + std::string remote_ip; + int remote_port = 0; + std::string account; + + void Init(); + void UnInit(); + void Update(); + + 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); + + private: + char *recv_buff_ = nullptr; + unsigned int recv_bufflen_ = 0; + + a8::TcpClient* tcp_client_ = nullptr; +};