2014-11-07 2 views
0

В моей реализации tcp отношения клиент-сервер я заметил, что только клиентский сокет способен обнаруживать, когда сокет сервера закрывается. Без помощи сердцебиения серверный сокет не может обнаружить разрыв клиента.Почему клиентский сокет обнаруживает соединение с сервером, но не наоборот?

Почему этот односторонний? Существуют ли альтернативы биениям, чтобы определить, продолжает ли соединение жить с точки зрения сервера? Ссылки оценены!

+0

Потому что у вас есть ошибка в вашем (невидимом) коде. Это не односторонне. – EJP

ответ

2

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

Близкий от пира с TCP/IP можно обнаружить только с помощью приложения:

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

Если вы ни пытаетесь ни читать, ни писать, вы не можете обнаружить соединение рядом со сверстником. Неважно, являетесь ли вы клиентом или сервером.

0

Вам нужно различать закрытие TCP-соединения и «отсоединение». Что означает «отключить»?

Закрытие соединения является частью протокола TCP, поэтому, если одна или другая сторона закрывает его соединение, тогда противоположная сторона получит пакет для его указания.

Однако, если одна сторона просто исчезает, то другая сторона не знает об этом.

Протокол TCP был разработан, чтобы быть надежным во враждебных средах связи, и обычно он не будет решать, что соединение закрыто только потому, что оно не слышало с другой стороны какое-то время.

Эта проблема может быть уменьшена путем установки опции SO_KEEPALIVE на сокете.

Смежные вопросы