• Erlang Go а тем временем программисты на языке Go интересуются, как же им можно понять от HTTP клиента, что соединение само собой закрылось по таймауту.
    Главное в нашем деле правильно задизайнить ядро

Replies (8)

  • @maxlapshin, Как я понял — единственный способ, это почитать что нибудь из сокета. Если вернулось "опачки" — значит соединение закрылось.
  • @ufm, ну главное, что это всё очень нетривиально и не унифицированно
  • @maxlapshin, Проблемы понять, что ошибка при выполнении запроса (или любой сетевой операции) возникла в результате превышения таймаута — нет. Все нужные интерфейсы для этого есть (net.Error).
    Есть проблема в том, чтобы узнать живо ли TCP-соединение, когда по нему не передаются данные. И это проблема в дизайне TCP, а не в Go.
  • @antage, нет, не проблема это в TCP. Проблема в том, как получить нотификацию от сокета об этом.
  • @maxlapshin, И как же получить нотификацию от сокета об этом в том же линуксе? Пусть даже на кошерном Си?
  • @antage, о том, что сокет закрылся? Например, можно включить keepalive. Или поставить таймер у себя и понять, что за это время ничего не приходило по сокету
  • @maxlapshin, Ты про SO_KEEPALIVE? Если да, то он только освобождает ресурсы ОС соединения, если удаленная сторона не отвечает, но никак не сообщает об этом процессу. Т.е. в любом случае нужна надстройка над TCP — либо гонять собственные ping/pong проверки на уровне приложения, либо закрывать по idle timeout, как ты предложил.
  • @antage, Повторюсь — надо прочитать из сокета. Если вернулся EOF — значит сокет закрыли с "той" стороны