Как я могу узнать, закрыл ли клиент соединение?
Я проверил stream3.c
пример и обнаружил, что когда я закрывал страницу в браузере, сервлет, т.е. stream3.c
, по-прежнему работает около 2 раундов, а затем прекращено.
Это означает, что данные последних 2 раундов были потеряны.
Кто может объяснить, как подтвердить состояние соединения перед отправкой данных?
Очевидно, что gwan знает статус соединения, иначе он не прервет stream3.c
, но Гван может не знать об этом в режиме реального времени.
Если нет способа узнать это в режиме реального времени, важные данные не могут быть отправлены без двойной проверки таким способом.
1 ответ
как подтвердить состояние соединения перед отправкой данных?
Единственный надежный способ сделать это - попытаться отправить данные в сокет клиента. Если соединение было закрыто, то вызов не удастся.
Если розетка была переработана (повторно использована другим новым соединением), то SESSION_ID
(и, возможно, IP-адрес клиента) будет другим.
Если соединение было "чисто" закрыто (если клиент использовал shutdown()
и немного подождал перед закрытием) тогда G-WAN узнает о состоянии соединения перед сервлетом, в противном случае G-WAN узнает только при отправке ответа (или после тайм-аута чтения / записи).
Чтобы помочь в случаях, описанных в этом вопросе, новое состояние называется BEFORE_CLOSE
был добавлен несколько недель назад для кого-то, работающего над Websockets.