Прежде всего, X Protocol полностью полагается на TCP для отправки / получения информации.
Вы не можете безопасно поместить транзакцию с поддержкой тайм-аута для обнаружения тайм-аута в TCP.TCP предназначен для повторной передачи только тех сегментов, которые уже были отправлены, но не подтверждены.Он полностью асинхронный, в том смысле, что вы отправляете команду, и вы можете получить много ответов или событий, не связанных с этой командой, до того, как получите ответ.В XProtocol отсутствует механизм тактового импульса (за исключением того, что команда NOOP отправляется для синхронизации операций с сервером, и вы получаете ответ на него, но вы не можете использовать его чрезмерно, поскольку это сильно замедляет X-соединение, просто запустите любой клиент с-synchronous
вариант, чтобы увидеть его, см. X (7) ).Вы даже можете годами поддерживать TCP-соединения, не переставляя один пакет.Есть некоторый механизм, активируемый опцией SO_KEEPALIVE
, который заставляет tcp использовать такое биение в TCP для соединения, у которого нет данных для передачи, но протокол X11 обычно не использует его.Вы не публикуете ни код, ни описание того, как настроена система.Стандартный XServer никогда никогда не запускает соединение самостоятельно, за исключением случаев, когда он запускается специально для согласования с сервером XDMCP (и это делается по протоколу UDP) для использования в качестве XTerminal.
Из ваших словвероятно, вы не знаете, что роли сервера и клиента обмениваются в протоколе X (клиент - это удаленное приложение, которое подключается к серверу для отображения своего вывода, а сервер - это приложение, которое управляет вашим дисплеем, мышью и клавиатурой)У сервера нет средств для создания нового клиента, поэтому вам нужно создать это соединение другими способами (возможно, через SSH, но не описано).
Кстати, когда вы говорите:
Эксперименты показывают, что при отключении кабельного соединения требуется некоторое время ожидания TCP для обнаружения потери соединения на уровне сокета.Это очень зависит от ОС.В нашем случае прошло около 30 минут, после чего X-сервер в итоге закрыл окно.
Это не зависит от ОС.Это точно стандартное поведение, когда у вас нет трафика для отправки, нет обмена пакетами, поэтому не выполняется обнаружение (кроме случаев, когда ваш клиент - помните, это удаленная прикладная программа, которая хочет показать свои данные в вашемлокальный сервер --- активирует опцию SO_KEEPALIVE, а для требуется несколько потерь, прежде чем объявлять потерянное соединение ). В вашем случае количество времени является переменным, потому что таймеры не запускаются до тех пор, пока некоторые данные не отправляются через неподключенныйсоединение, и это делает его переменным (не зависящим от ОС)
С другой стороны, вы не можете притворяться, что сервер включит ваш монитор в случае, если вы покинете офис и выключите его по ошибке или по случайности.Какова спецификация отказоустойчивости в этом случае?
ИМХО, что касается протокола представления, приложение должно быть готово показать вам как можно больше информации о системе, как только вы активируете соединение (но соединениедолжно быть что-то допущено к провалу).Важно то, какие средства вы разрабатываете для обеспечения отказоустойчивости приложения, даже если вы не видите дисплей.Будет ли кто-то предупрежден, что никто не смотрит на экран?Вы собираетесь обнаружить отсутствие операторов в этом случае?Не воспринимайте это как пламя, но здравый смысл в этом случае должен проявляться.
Если вам необходимо убедиться, что подключение к удаленному хосту доступно, вам нужно использовать другое средство для проверки.Я рекомендую вам иметь простое приложение, проверяющее связь с удаленным хостом и оповещающее на случай, если вы не получите положительного результата.Или вы можете открыть соединение с сервером, а затем закрыть его, как только вы получите положительный ответ от сервера (например, первый пакет). Это приведет нас к следующему шагу, то есть к тому, что какой-то человек ищетна (включенном) экране дисплея:)
Например, вы можете запустить клиент параллельно с тем, который вас интересует, и заставить пульс, запрашивая какое-либо имя атома сервера (илизначение свойства корневого окна) в цикле с некоторой задержкой.Это приведет к сбою соединения, или ваш клиент может предупредить, если он не получит ответ в течение некоторого настраиваемого времени.