Я периодами пишу свою игруху, архитектурой (не гейплеем) похожую на линейку, поэтому тож поделюсь догадками... Каждый клиент соединяется с сервером отдельным коннектом (socket). Через этот коннект и происходит обмен данными между клиентом и сервером. Сервер и клиент "слушают" и "рассылают" друг другу "сообщения".
Сам механизм работы сокетов предполагает, что при прекращении работы одной из сторон, это сообщается второй стороне. Например, сервер рубанулся с ошибкой - клиенту шлется команда потери коннекта. Игрок закрыл клиент - серверу шлется команда о закрытии коннекта. К сожалению, это слабое место этой системы, и в реальностях, при нагрузке, соединение со стороны клиента может быть потеряно, а сервер команды потери может не получить, продолжая ждать новых асинхронных команд.
Эта ситуация обычно учитывается при разработке клиент-серверных приложений и, для страховки, одна из сторон регулярно пингует вторую. Если на пинг нет ответа некоторое количество попыток и/или секунд, то коннект гасится принудительно.
Предполагаю, что в линейке (конкретно у нас), клиент пингует сервер, а сервер просто отрабатывает асинхронные запросы. Клиент отвалился не послав команду серверу - помните может... в 90% случаев винда сообщает об этом ошибкой при закрытии клиента. Сервер ждет себе спокойно новых запросов по этому коннекту до ситуации, пока ему не понадобиться сообщить клиенту что-то. Например в радиусе нашего игрока пробежал другой игрок - уже отвалившемуся клиенту сервер пытается послать координаты, скорость, внешний вид, ник... перемещающегося игрока - фейл, тогда только он закрывает коннект со своей стороны.
Если значимых событий рядом не было, о которых надо сообщить клиенту по инициативе сервера, то коннект и будет продолжать висеть. А при попытке клиента зайти ещё раз, ему сообщиться, что он уже в игре. )