Revert internal send to old code

This commit is contained in:
KimLS 2019-02-24 15:20:01 -08:00
parent 37915f5b7e
commit b156b078ed
2 changed files with 54 additions and 67 deletions

View File

@ -1182,74 +1182,60 @@ void EQ::Net::DaybreakConnection::SendKeepAlive()
void EQ::Net::DaybreakConnection::InternalSend(Packet &p) void EQ::Net::DaybreakConnection::InternalSend(Packet &p)
{ {
m_last_send = Clock::now(); m_last_send = Clock::now();
auto send_func = [](uv_udp_send_t* req, int status) { auto send_func = [](uv_udp_send_t* req, int status) {
delete[](char*)req->data; delete[](char*)req->data;
delete req; delete req;
}; };
if (PacketCanBeEncoded(p)) { if (PacketCanBeEncoded(p)) {
DynamicPacket *out = new DynamicPacket(); DynamicPacket out;
out->PutPacket(0, p); out.PutPacket(0, p);
auto sp = shared_from_this();
EQ::Task([sp, out](EQ::Task::ResolveFn resolve, EQ::Task::RejectFn reject) {
auto encode_passes = sp->GetEncodePasses();
for (int i = 0; i < 2; ++i) { for (int i = 0; i < 2; ++i) {
switch (encode_passes[i]) { switch (m_encode_passes[i]) {
case EncodeCompression: case EncodeCompression:
if(out->GetInt8(0) == 0) if (out.GetInt8(0) == 0)
sp->Compress(*out, DaybreakHeader::size(), out->Length() - DaybreakHeader::size()); Compress(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size());
else else
sp->Compress(*out, 1, out->Length() - 1); Compress(out, 1, out.Length() - 1);
break; break;
case EncodeXOR: case EncodeXOR:
if (out->GetInt8(0) == 0) if (out.GetInt8(0) == 0)
sp->Encode(*out, DaybreakHeader::size(), out->Length() - DaybreakHeader::size()); Encode(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size());
else else
sp->Encode(*out, 1, out->Length() - 1); Encode(out, 1, out.Length() - 1);
break; break;
default: default:
break; break;
} }
} }
sp->AppendCRC(*out); AppendCRC(out);
resolve(out);
})
.Then([sp, out, send_func](const EQEmu::Any &result) {
uv_udp_send_t *send_req = new uv_udp_send_t; uv_udp_send_t *send_req = new uv_udp_send_t;
memset(send_req, 0, sizeof(*send_req)); memset(send_req, 0, sizeof(*send_req));
sockaddr_in send_addr; sockaddr_in send_addr;
uv_ip4_addr(sp->RemoteEndpoint().c_str(), sp->RemotePort(), &send_addr); uv_ip4_addr(m_endpoint.c_str(), m_port, &send_addr);
uv_buf_t send_buffers[1]; uv_buf_t send_buffers[1];
char *data = new char[out->Length()]; char *data = new char[out.Length()];
memcpy(data, out->Data(), out->Length()); memcpy(data, out.Data(), out.Length());
send_buffers[0] = uv_buf_init(data, out->Length()); send_buffers[0] = uv_buf_init(data, out.Length());
send_req->data = send_buffers[0].base; send_req->data = send_buffers[0].base;
auto &stats = sp->GetStats(); m_stats.sent_bytes += out.Length();
m_stats.sent_packets++;
stats.sent_bytes += out->Length(); if (m_owner->m_options.simulated_out_packet_loss && m_owner->m_options.simulated_out_packet_loss >= m_owner->m_rand.Int(0, 100)) {
stats.sent_packets++;
auto owner = sp->GetManager();
if (owner->m_options.simulated_out_packet_loss && owner->m_options.simulated_out_packet_loss >= owner->m_rand.Int(0, 100)) {
delete[](char*)send_req->data; delete[](char*)send_req->data;
delete send_req; delete send_req;
return; return;
} }
uv_udp_send(send_req, &owner->m_socket, send_buffers, 1, (sockaddr*)&send_addr, send_func); uv_udp_send(send_req, &m_owner->m_socket, send_buffers, 1, (sockaddr*)&send_addr, send_func);
}) return;
.Finally([out]() {
delete out;
})
.Run();
} }
else {
uv_udp_send_t *send_req = new uv_udp_send_t; uv_udp_send_t *send_req = new uv_udp_send_t;
sockaddr_in send_addr; sockaddr_in send_addr;
uv_ip4_addr(m_endpoint.c_str(), m_port, &send_addr); uv_ip4_addr(m_endpoint.c_str(), m_port, &send_addr);
@ -1270,7 +1256,6 @@ void EQ::Net::DaybreakConnection::InternalSend(Packet &p)
} }
uv_udp_send(send_req, &m_owner->m_socket, send_buffers, 1, (sockaddr*)&send_addr, send_func); uv_udp_send(send_req, &m_owner->m_socket, send_buffers, 1, (sockaddr*)&send_addr, send_func);
}
} }
void EQ::Net::DaybreakConnection::InternalQueuePacket(Packet &p, int stream_id, bool reliable) void EQ::Net::DaybreakConnection::InternalQueuePacket(Packet &p, int stream_id, bool reliable)

View File

@ -95,7 +95,7 @@ namespace EQ
class DaybreakConnectionManager; class DaybreakConnectionManager;
class DaybreakConnection; class DaybreakConnection;
class DaybreakConnection : public std::enable_shared_from_this<DaybreakConnection> class DaybreakConnection
{ {
public: public:
DaybreakConnection(DaybreakConnectionManager *owner, const DaybreakConnect &connect, const std::string &endpoint, int port); DaybreakConnection(DaybreakConnectionManager *owner, const DaybreakConnect &connect, const std::string &endpoint, int port);
@ -267,6 +267,8 @@ namespace EQ
void OnNewConnection(std::function<void(std::shared_ptr<DaybreakConnection>)> func) { m_on_new_connection = func; } void OnNewConnection(std::function<void(std::shared_ptr<DaybreakConnection>)> func) { m_on_new_connection = func; }
void OnConnectionStateChange(std::function<void(std::shared_ptr<DaybreakConnection>, DbProtocolStatus, DbProtocolStatus)> func) { m_on_connection_state_change = func; } void OnConnectionStateChange(std::function<void(std::shared_ptr<DaybreakConnection>, DbProtocolStatus, DbProtocolStatus)> func) { m_on_connection_state_change = func; }
void OnPacketRecv(std::function<void(std::shared_ptr<DaybreakConnection>, const Packet &)> func) { m_on_packet_recv = func; } void OnPacketRecv(std::function<void(std::shared_ptr<DaybreakConnection>, const Packet &)> func) { m_on_packet_recv = func; }
DaybreakConnectionManagerOptions& GetOptions() { return m_options; }
private: private:
void Attach(uv_loop_t *loop); void Attach(uv_loop_t *loop);
void Detach(); void Detach();