diff --git a/common/net/daybreak_connection.cpp b/common/net/daybreak_connection.cpp index 60412c497..13827581c 100644 --- a/common/net/daybreak_connection.cpp +++ b/common/net/daybreak_connection.cpp @@ -1016,6 +1016,7 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) return; } + auto resends = 0; auto now = Clock::now(); auto s = &m_streams[stream]; for (auto &entry : s->sent_packets) { @@ -1026,6 +1027,7 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) entry.second.last_sent = now; entry.second.times_resent++; entry.second.resend_delay = EQEmu::Clamp(entry.second.resend_delay * 2, m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); + resends++; } } else { @@ -1040,8 +1042,13 @@ void EQ::Net::DaybreakConnection::ProcessResend(int stream) entry.second.last_sent = now; entry.second.times_resent++; entry.second.resend_delay = EQEmu::Clamp(entry.second.resend_delay * 2, m_owner->m_options.resend_delay_min, m_owner->m_options.resend_delay_max); + resends++; } } + + if (resends >= m_owner->m_options.resends_per_connection_cycle) { + return; + } } } diff --git a/common/net/daybreak_connection.h b/common/net/daybreak_connection.h index 823fd82e8..f7ea49e22 100644 --- a/common/net/daybreak_connection.h +++ b/common/net/daybreak_connection.h @@ -208,7 +208,8 @@ namespace EQ resend_delay_ms = 30; resend_delay_factor = 1.25; resend_delay_min = 150; - resend_delay_max = 3000; + resend_delay_max = 5000; + resends_per_connection_cycle = 10; connect_delay_ms = 500; stale_connection_ms = 90000; connect_stale_ms = 5000; @@ -233,6 +234,7 @@ namespace EQ size_t resend_delay_ms; size_t resend_delay_min; size_t resend_delay_max; + int resends_per_connection_cycle; size_t connect_delay_ms; size_t connect_stale_ms; size_t stale_connection_ms; diff --git a/common/ruletypes.h b/common/ruletypes.h index 623260af4..12ce35b6a 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -704,6 +704,14 @@ RULE_CATEGORY(Console) RULE_INT(Console, SessionTimeOut, 600000) // Amount of time in ms for the console session to time out RULE_CATEGORY_END() +RULE_CATEGORY(Network) +RULE_INT(Network, ResendDelayBaseMS, 50) +RULE_REAL(Network, ResendDelayFactor, 1.5) +RULE_INT(Network, ResendDelayMinMS, 250) +RULE_INT(Network, ResendDelayMaxMS, 5000) +RULE_INT(Network, ResendsPerCycle, 10) +RULE_CATEGORY_END() + RULE_CATEGORY(QueryServ) RULE_BOOL(QueryServ, PlayerLogChat, false) // Logs Player Chat RULE_BOOL(QueryServ, PlayerLogTrades, false) // Logs Player Trades diff --git a/ucs/clientlist.cpp b/ucs/clientlist.cpp index 130914952..3701d4dc2 100644 --- a/ucs/clientlist.cpp +++ b/ucs/clientlist.cpp @@ -469,6 +469,12 @@ Clientlist::Clientlist(int ChatPort) { EQ::Net::EQStreamManagerOptions chat_opts(ChatPort, false, false); chat_opts.opcode_size = 1; chat_opts.daybreak_options.stale_connection_ms = 300000; + chat_opts.daybreak_options.resend_delay_ms = RuleI(Network, ResendDelayBaseMS); + chat_opts.daybreak_options.resend_delay_factor = RuleR(Network, ResendDelayFactor); + chat_opts.daybreak_options.resend_delay_min = RuleI(Network, ResendDelayMinMS); + chat_opts.daybreak_options.resend_delay_max = RuleI(Network, ResendDelayMaxMS); + chat_opts.daybreak_options.resends_per_connection_cycle = RuleI(Network, ResendsPerCycle); + chatsf = new EQ::Net::EQStreamManager(chat_opts); ChatOpMgr = new RegularOpcodeManager; diff --git a/world/net.cpp b/world/net.cpp index 7065ea6c3..65be8c3d0 100644 --- a/world/net.cpp +++ b/world/net.cpp @@ -495,6 +495,12 @@ int main(int argc, char** argv) { }); EQ::Net::EQStreamManagerOptions opts(9000, false, false); + opts.daybreak_options.resend_delay_ms = RuleI(Network, ResendDelayBaseMS); + opts.daybreak_options.resend_delay_factor = RuleR(Network, ResendDelayFactor); + opts.daybreak_options.resend_delay_min = RuleI(Network, ResendDelayMinMS); + opts.daybreak_options.resend_delay_max = RuleI(Network, ResendDelayMaxMS); + opts.daybreak_options.resends_per_connection_cycle = RuleI(Network, ResendsPerCycle); + EQ::Net::EQStreamManager eqsm(opts); //register all the patches we have avaliable with the stream identifier. @@ -622,4 +628,4 @@ void CheckForServerScript(bool force_download) { system("wget -N --no-check-certificate --quiet -O eqemu_server.pl https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/eqemu_server.pl"); #endif } -} \ No newline at end of file +} diff --git a/zone/net.cpp b/zone/net.cpp index 641c69248..c13fc5e84 100644 --- a/zone/net.cpp +++ b/zone/net.cpp @@ -460,6 +460,11 @@ int main(int argc, char** argv) { Log(Logs::General, Logs::Zone_Server, "Starting EQ Network server on port %d", Config->ZonePort); EQ::Net::EQStreamManagerOptions opts(Config->ZonePort, false, true); + opts.daybreak_options.resend_delay_ms = RuleI(Network, ResendDelayBaseMS); + opts.daybreak_options.resend_delay_factor = RuleR(Network, ResendDelayFactor); + opts.daybreak_options.resend_delay_min = RuleI(Network, ResendDelayMinMS); + opts.daybreak_options.resend_delay_max = RuleI(Network, ResendDelayMaxMS); + opts.daybreak_options.resends_per_connection_cycle = RuleI(Network, ResendsPerCycle); eqsm.reset(new EQ::Net::EQStreamManager(opts)); eqsf_open = true;