This commit is contained in:
aozhiwei 2019-05-29 21:41:27 +08:00
parent 7974a204e8
commit 6d81d9dbeb
4 changed files with 138 additions and 4 deletions

View File

@ -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);

View File

@ -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,

View File

@ -0,0 +1,103 @@
#include "precompile.h"
#include <string.h>
#include <a8/tcpclient.h>
#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;
}

View File

@ -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;
};