Quando o servidor fecha a conexão às pressas, o último aviso enviado ou o sinal de salvamento concluído se perde.
Por quê O servidor fecha a conexão com encerramento forçado (RST). Acontece com SO_LINGER em 0 s ou ao fechar sem ler todos os dados recebidos → Efeito O motivo do kick e os últimos dados que ainda estavam sendo enviados são descartados → Na tela “Conexão encerrada por erro desconhecido” sem motivo aparente
Responsável principal Desenvolvimento do servidor (Equipe de desenvolvimento)
O que fazer (Equipe de desenvolvimento)
Depois de enviar o motivo, fechar primeiro só a direção de envio (shutdown), ler até o fim os dados recebidos até o outro lado fechar e só então fechar, evitar SO_LINGER com 0 s.
No gráfico
Picos aleatórios · Conexões encerradas com RST
Onde olhar
Ver o aumento de TcpExtTCPAbortOnData (fechou com RST com dados ainda por enviar, SO_LINGER em 0 s) e TcpExtTCPAbortOnClose (fechou com dados não lidos) no nstat -az, e ver numa captura de pacotes do lado do servidor, no momento da queda, se o servidor fecha com RST ou com FIN
Confirma se
No horário dos reports de “Conexão encerrada por erro desconhecido”, o servidor envia RST, e AbortOnData e AbortOnClose sobem
Descarta se
O servidor encerrou normalmente com FIN, mas o motivo não aparece: aponta para o tratamento do encerramento no cliente
Como verificar
Ferramentas de infra (sem precisar do código do jogo)
Fontes
closesocket function (winsock.h)Microsoft Com SO_LINGER ligado e tempo 0, o fechamento vira um encerramento forçado que reseta a conexão na hora, e os dados não enviados se perdem
SNMP counterLinux kernel TcpExtTCPAbortOnData: fechou com RST com dados ainda por enviar, por exemplo com SO_LINGER em 0 s; TcpExtTCPAbortOnClose: fechou com dados não lidos e enviou RST