mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-12 05:21:29 +00:00
Revert internal send to old code
This commit is contained in:
parent
37915f5b7e
commit
b156b078ed
@ -1182,95 +1182,80 @@ 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();
|
for (int i = 0; i < 2; ++i) {
|
||||||
EQ::Task([sp, out](EQ::Task::ResolveFn resolve, EQ::Task::RejectFn reject) {
|
switch (m_encode_passes[i]) {
|
||||||
|
case EncodeCompression:
|
||||||
auto encode_passes = sp->GetEncodePasses();
|
if (out.GetInt8(0) == 0)
|
||||||
for (int i = 0; i < 2; ++i) {
|
Compress(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size());
|
||||||
switch (encode_passes[i]) {
|
else
|
||||||
case EncodeCompression:
|
Compress(out, 1, out.Length() - 1);
|
||||||
if(out->GetInt8(0) == 0)
|
break;
|
||||||
sp->Compress(*out, DaybreakHeader::size(), out->Length() - DaybreakHeader::size());
|
case EncodeXOR:
|
||||||
else
|
if (out.GetInt8(0) == 0)
|
||||||
sp->Compress(*out, 1, out->Length() - 1);
|
Encode(out, DaybreakHeader::size(), out.Length() - DaybreakHeader::size());
|
||||||
break;
|
else
|
||||||
case EncodeXOR:
|
Encode(out, 1, out.Length() - 1);
|
||||||
if (out->GetInt8(0) == 0)
|
break;
|
||||||
sp->Encode(*out, DaybreakHeader::size(), out->Length() - DaybreakHeader::size());
|
default:
|
||||||
else
|
break;
|
||||||
sp->Encode(*out, 1, out->Length() - 1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
sp->AppendCRC(*out);
|
|
||||||
resolve(out);
|
|
||||||
})
|
|
||||||
.Then([sp, out, send_func](const EQEmu::Any &result) {
|
|
||||||
uv_udp_send_t *send_req = new uv_udp_send_t;
|
|
||||||
memset(send_req, 0, sizeof(*send_req));
|
|
||||||
sockaddr_in send_addr;
|
|
||||||
uv_ip4_addr(sp->RemoteEndpoint().c_str(), sp->RemotePort(), &send_addr);
|
|
||||||
uv_buf_t send_buffers[1];
|
|
||||||
|
|
||||||
char *data = new char[out->Length()];
|
|
||||||
memcpy(data, out->Data(), out->Length());
|
|
||||||
send_buffers[0] = uv_buf_init(data, out->Length());
|
|
||||||
send_req->data = send_buffers[0].base;
|
|
||||||
|
|
||||||
auto &stats = sp->GetStats();
|
|
||||||
|
|
||||||
stats.sent_bytes += out->Length();
|
AppendCRC(out);
|
||||||
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 send_req;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uv_udp_send(send_req, &owner->m_socket, send_buffers, 1, (sockaddr*)&send_addr, send_func);
|
|
||||||
})
|
|
||||||
.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;
|
||||||
|
memset(send_req, 0, sizeof(*send_req));
|
||||||
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);
|
||||||
uv_buf_t send_buffers[1];
|
uv_buf_t send_buffers[1];
|
||||||
|
|
||||||
char *data = new char[p.Length()];
|
char *data = new char[out.Length()];
|
||||||
memcpy(data, p.Data(), p.Length());
|
memcpy(data, out.Data(), out.Length());
|
||||||
send_buffers[0] = uv_buf_init(data, p.Length());
|
send_buffers[0] = uv_buf_init(data, out.Length());
|
||||||
send_req->data = send_buffers[0].base;
|
send_req->data = send_buffers[0].base;
|
||||||
|
|
||||||
m_stats.sent_bytes += p.Length();
|
m_stats.sent_bytes += out.Length();
|
||||||
m_stats.sent_packets++;
|
m_stats.sent_packets++;
|
||||||
|
|
||||||
if (m_owner->m_options.simulated_out_packet_loss && m_owner->m_options.simulated_out_packet_loss >= m_owner->m_rand.Int(0, 100)) {
|
if (m_owner->m_options.simulated_out_packet_loss && m_owner->m_options.simulated_out_packet_loss >= m_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, &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);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uv_udp_send_t *send_req = new uv_udp_send_t;
|
||||||
|
sockaddr_in send_addr;
|
||||||
|
uv_ip4_addr(m_endpoint.c_str(), m_port, &send_addr);
|
||||||
|
uv_buf_t send_buffers[1];
|
||||||
|
|
||||||
|
char *data = new char[p.Length()];
|
||||||
|
memcpy(data, p.Data(), p.Length());
|
||||||
|
send_buffers[0] = uv_buf_init(data, p.Length());
|
||||||
|
send_req->data = send_buffers[0].base;
|
||||||
|
|
||||||
|
m_stats.sent_bytes += p.Length();
|
||||||
|
m_stats.sent_packets++;
|
||||||
|
|
||||||
|
if (m_owner->m_options.simulated_out_packet_loss && m_owner->m_options.simulated_out_packet_loss >= m_owner->m_rand.Int(0, 100)) {
|
||||||
|
delete[](char*)send_req->data;
|
||||||
|
delete send_req;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user