1
This commit is contained in:
parent
7974a204e8
commit
6d81d9dbeb
@ -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);
|
||||
|
@ -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,
|
||||
|
103
server/robotserver/virtualclient.cc
Normal file
103
server/robotserver/virtualclient.cc
Normal 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;
|
||||
}
|
31
server/robotserver/virtualclient.h
Normal file
31
server/robotserver/virtualclient.h
Normal 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;
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user