Как я могу узнать, закрыл ли клиент соединение?

Я проверил stream3.c пример и обнаружил, что когда я закрывал страницу в браузере, сервлет, т.е. stream3.c, по-прежнему работает около 2 раундов, а затем прекращено.

Это означает, что данные последних 2 раундов были потеряны.

Кто может объяснить, как подтвердить состояние соединения перед отправкой данных?

Очевидно, что gwan знает статус соединения, иначе он не прервет stream3.c, но Гван может не знать об этом в режиме реального времени.

Если нет способа узнать это в режиме реального времени, важные данные не могут быть отправлены без двойной проверки таким способом.

1 ответ

Решение

как подтвердить состояние соединения перед отправкой данных?

Единственный надежный способ сделать это - попытаться отправить данные в сокет клиента. Если соединение было закрыто, то вызов не удастся.

Если розетка была переработана (повторно использована другим новым соединением), то SESSION_ID (и, возможно, IP-адрес клиента) будет другим.

Если соединение было "чисто" закрыто (если клиент использовал shutdown() и немного подождал перед закрытием) тогда G-WAN узнает о состоянии соединения перед сервлетом, в противном случае G-WAN узнает только при отправке ответа (или после тайм-аута чтения / записи).

Чтобы помочь в случаях, описанных в этом вопросе, новое состояние называется BEFORE_CLOSE был добавлен несколько недель назад для кого-то, работающего над Websockets.

Другие вопросы по тегам