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

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

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

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

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

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


person k.k. lou    schedule 29.06.2013    source источник


Ответы (1)


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

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

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

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

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

person Gil    schedule 30.06.2013