X11是否有生命符号或恒定流?

时间:2018-12-17 13:35:48

标签: linux x11

我有一个容错应用程序,其中X Server请求(通过某种其他机制)在远程客户端上启动应用程序,并接收和显示其X窗口。容错意味着服务器需要检测到与客户端的连接丢失,然后调用其他备份客户端并在此处启动应用程序并显示窗口。

我的问题是X11协议中是否存在一种机制,该机制可以在X11-Server中可靠地检测连接是否断开。

实验表明,拔下电缆连接时,它需要一些TCP超时来检测套接字级别的连接丢失。这非常依赖于操作系统。在我们的案例中,大约30分钟之后,X服务器最终关闭了窗口。

因此,另一个假设可能是X11流不断传递一些命令,而服务器可以实现如下逻辑:如果X11流在超时y(例如3秒)内没有传递任何X11流量,我们假设连接丢失,并主动关闭窗口并建立与回退客户端的连接。

假设是否正确?我没有在X11-protocol中看到有关如何检测连接丢失的任何此类声明。是否有定期传送的明确生命体征?还是假设流量持续不变是否有效?还是可能会有更长的不活动时间,而当连接完美启动并运行时,什么也没有传输?

来自客户端的NoOperation命令可用于此目的。但是客户通常将这样的东西作为生命标志吗?

2 个答案:

答案 0 :(得分:1)

  

我有一个容错应用程序,其中X Server需要启动一个应用程序...

我不认为X服务器可以“启动应用程序”。可能是某些设置允许执行类似操作,但通常并非如此。

  

... X11协议中是否存在一种机制,该机制允许在X11-Server中可靠地检测连接是否断开。

否,它不存在。 X11协议基于TCP / IP,它不直接提供此“心跳”。我认为这样的假设是,如果单击或以其他方式刺激X11窗口,则如果客户端应用程序消失了,则TCP层将超时或引发另一个错误。

  

我没有在X11协议中看到有关如何检测连接丢失的任何声明。

     

来自客户端的NoOperation命令可用于此目的。但是客户通常将这样的东西作为生命标志吗?

也许某些应用程序使用了NoOperation,但目的与您所需要的不同。我的意思是,从应用程序的角度来看,X11服务器就像是扩展。应用程序可能会对知道服务器是否已启动并正在工作感兴趣,但是事实并非如此。而且,无论如何,即使服务器可以检测到该应用程序已消失,也可能无法告诉服务器启动另一个应用程序。

可能会部署一个特殊的代理;它可以启动应用程序并监视连接(通过两种方式),并采取必要的步骤以防应用程序消失。但是话又说回来,谁来监视代理应用程序?

答案 1 :(得分:0)

首先,X协议完全依靠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选项,在声明断开连接之前,它需要几次丢失)。在您的情况下,时间量是可变的,因为在启动某些数据之前,计时器不会启动拔掉连接,这使它可变(不依赖于操作系统)

另一方面,您不能假装服务器要打开显示器,以防万一您离开办公室并因错误或意外关闭服务器。在那种情况下,容错规范是什么?

恕我直言,关于表示协议,一旦激活连接,应用程序应准备向您显示有关系统的尽可能多的信息(但必须允许连接失败)。重要的是,即使您不在那里查看显示屏,也要为应用程序开发容错的方法。有人会被告知没有人看着屏幕吗?在这种情况下,您要检测是否缺少运算符吗?不要以为这是火焰,但在这种情况下,常识应该发挥作用。

如果需要确保与远程主机的连接可用,则需要使用另一种方法进行检查。我建议您有一个简单的应用程序ping远程主机并发出警报,以防万一您没有得到满意的结果。或者,您可以打开与服务器的连接,然后在收到服务器的积极响应后立即将其关闭(例如,第一个数据包)。这将引导我们进行下一步,即确保有人在寻找在(打开的)屏幕上:)

例如,您可以与您感兴趣的客户端并行运行一个客户端,并通过在循环中延迟一些请求服务器原子名称(或根窗口属性值)来强制检测信号。这将导致连接失败,或者您的客户端可以发出警报,以防它在可配置的时间内未收到答案。