Есть ли у X11 жизненный или постоянный поток? - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть отказоустойчивое приложение, в котором X-сервер запрашивает запуск приложения на удаленном клиенте (с помощью какого-либо другого механизма), а также получает и отображает его X-окно.Отказоустойчивость означает, что серверу необходимо обнаружить потерю соединения с клиентом, а затем вызвать другого резервного клиента и запустить там приложение и показать окно.

Мой вопрос заключается в том, существует ли механизмв протоколе X11, который позволяет надежно определять на сервере X11, было ли соединение разорвано или нет.

Эксперименты показывают, что при отключении кабельного соединения требуется некоторое время ожидания TCP для обнаружения потери соединения на сокетеуровень.Это очень зависит от ОС.В нашем случае это было примерно через 30 минут, после чего X-сервер в конце концов закрыл окно.

Таким образом, можно предположить, что поток X11 постоянно доставляет некоторые команды, и сервер может реализовывать некоторую логику, подобную этой:X11-поток не доставляет трафик X11 в течение времени ожидания y (например, 3 секунды), мы предполагаем, что соединение потеряно, и активно закрываем окно и устанавливаем соединение с резервным клиентом.

Isпредположение верно?Я не видел ни одного такого заявления в X11-протоколе о том, как обнаружить потерю соединения.Есть ли явный жизненный знак, который регулярно передается?Или предположение верно, что существует постоянный трафик?Или могут быть более длительные периоды бездействия, когда вообще ничего не передается, пока соединение установлено и работает?

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

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Прежде всего, 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, а для требуется несколько потерь, прежде чем объявлять потерянное соединение ). В вашем случае количество времени является переменным, потому что таймеры не запускаются до тех пор, пока некоторые данные не отправляются через неподключенныйсоединение, и это делает его переменным (не зависящим от ОС)

С другой стороны, вы не можете притворяться, что сервер включит ваш монитор в случае, если вы покинете офис и выключите его по ошибке или по случайности.Какова спецификация отказоустойчивости в этом случае?

ИМХО, что касается протокола представления, приложение должно быть готово показать вам как можно больше информации о системе, как только вы активируете соединение (но соединениедолжно быть что-то допущено к провалу).Важно то, какие средства вы разрабатываете для обеспечения отказоустойчивости приложения, даже если вы не видите дисплей.Будет ли кто-то предупрежден, что никто не смотрит на экран?Вы собираетесь обнаружить отсутствие операторов в этом случае?Не воспринимайте это как пламя, но здравый смысл в этом случае должен проявляться.

Если вам необходимо убедиться, что подключение к удаленному хосту доступно, вам нужно использовать другое средство для проверки.Я рекомендую вам иметь простое приложение, проверяющее связь с удаленным хостом и оповещающее на случай, если вы не получите положительного результата.Или вы можете открыть соединение с сервером, а затем закрыть его, как только вы получите положительный ответ от сервера (например, первый пакет). Это приведет нас к следующему шагу, то есть к тому, что какой-то человек ищетна (включенном) экране дисплея:)

Например, вы можете запустить клиент параллельно с тем, который вас интересует, и заставить пульс, запрашивая какое-либо имя атома сервера (илизначение свойства корневого окна) в цикле с некоторой задержкой.Это приведет к сбою соединения, или ваш клиент может предупредить, если он не получит ответ в течение некоторого настраиваемого времени.

0 голосов
/ 17 декабря 2018

У меня есть отказоустойчивое приложение, где X-серверу нужно запустить приложение ...

Я не думаю, что X-сервер может "запустить приложение".Может быть, некоторые настройки допускают что-то похожее на это, но обычно это не так.

... существует ли в протоколе X11 механизм, позволяющий надежно определять на сервере X11, является лисоединение разорвано или нет.

Нет, оно не существует.Протокол X11 основан на TCP / IP, который не обеспечивает непосредственно этот «сердцебиение».Я думаю, что предположение состоит в том, что, если вы щелкнете или иным образом стимулируете окно X11, уровень TCP прекратит работу или выдаст другую ошибку, если клиентское приложение исчезнет.

Я не видел ни одного утверждения вX11-протокол о том, как обнаружить потерю соединения.

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

Может быть, что какое-то приложение использует этот NoOperation, но цель будет отличаться от того, что вам нужно.Я имею в виду, что сервер X11 - это расширение с точки зрения приложения;приложение может быть интересно узнать, работает ли сервер и работает, но это не так.И, в любом случае, даже если сервер может обнаружить, что приложение пропало, вероятно, нет способа сообщить серверу о запуске другого приложения.

Возможно, специальный прокси-сервер может быть развернут;он может запустить приложение и контролировать соединение (обоими способами) и предпринять необходимые шаги в случае, если приложение исчезнет.Но опять же, кто будет контролировать прокси-приложение?

...