我有一个容错应用程序,其中X Server请求启动远程客户端上的应用程序(通过某种其他机制),并接收和显示其X-window。容错意味着服务器需要检测到与客户端的连接丢失,然后调用不同的备份客户端并在那里启动应用程序并显示窗口。
我的问题是,在X11协议中是否存在一种机制,允许在X11服务器中可靠地检测连接是否已断开。
实验表明,在拔除电缆连接时,需要一定的TCP超时时间来检测套接字级别的连接丢失。这非常依赖于操作系统。在我们的例子中,大约是30分钟之后,X-Server最终关闭了窗口。
因此,另一个假设可能是X11流不断地传递一些命令,并且服务器可以实现如下逻辑:如果X11流在超时y(例如3秒)内没有传递任何X11流量,我们假设连接丢失,并主动关闭窗口并建立到回退客户端的连接。
假设是真的吗?我在X11-protocol中没有看到任何关于如何检测连接丢失的声明。有没有定期传递的明确的生命信号?或者,流量恒定的假设是有效的吗?或者,会不会有更长的不活动时间,当连接完全建立并运行时,根本不会有任何传输?
来自客户端的NoOperation命令可用于此目的。但是客户端通常会将这样的东西实现为一个生命标志吗?
发布于 2018-12-17 22:08:25
我有一个容错应用程序,其中X服务器需要启动一个应用程序...
我不认为X服务器可以“启动应用程序”。可能是一些设置允许类似的东西,但通常不是这样。
...whether在X11协议中存在一种机制,该机制允许在X11服务器中可靠地检测连接是否已断开。
不,它不存在。X11协议是基于TCP/IP的,它不直接提供这种“心跳”。我认为假设是,如果您单击或以其他方式刺激X11窗口,如果客户端应用程序消失,TCP层将超时或抛出另一个错误。
我在X11协议中没有看到任何关于如何检测连接丢失的声明。
来自客户端的NoOperation命令可用于此目的。但是客户端通常会将这样的东西实现为一个生命标志吗?
也许某些应用程序使用该NoOperation,但其用途可能与您需要的有所不同。我的意思是,从应用程序的角度来看,X11服务器就像是一个扩展;应用程序可能有兴趣知道服务器是否已启动并工作,但事实并非如此。而且,无论如何,即使服务器可以检测到应用程序已消失,也可能无法通知服务器启动另一个应用程序。
也许可以部署一个特殊的代理;它可以启动应用程序并监视连接(以两种方式),并在应用程序消失的情况下采取必要的步骤。但话又说回来,谁来监控代理应用程序呢?
发布于 2018-12-25 20:48:15
首先,X协议完全依赖于TCP来发送/接收信息。
您不能为了检测TCP中的超时而安全地放置具有超时能力的事务。TCP设计为仅重新传输已发送但未确认的数据段。从发送命令的意义上讲,它是完全异步的,并且在接收响应之前,您可以接收许多与该命令无关的响应或事件。XProtocol上没有心跳机制(除了发送NOOP命令来与服务器同步操作之外,您会收到它的响应,但您不能过度使用它,因为这会严重减慢X连接,只需启动任何带有-synchronous选项的客户端即可看到它,请参见X(7))。您甚至可以让TCP连接存活数年,而无需交换单个数据包。有一些机制,由选项SO_KEEPALIVE激活,使tcp在TCP上对没有数据要传输的连接使用这种心跳,但X11协议通常不利用它。您不需要发布任何代码,也不需要描述系统是如何配置的。标准的XServer 从不自己启动连接,除非启动时专门为了充当XTerminal而与XDMCP服务器协商(这是在UDP协议上完成的)。
从您的话中,您可能不知道服务器和客户机的角色是在X协议中交换的(客户机是连接到服务器以显示其输出的远程应用程序,而服务器是控制显示器、鼠标和键盘的应用程序)服务器无法创建新的客户机,因此您需要以其他方式(可能是通过SSH,但没有描述)来创建此连接。
顺便说一下,当你说:
实验表明,在拔除电缆连接时,需要一定的超时时间来检测套接字级别的连接丢失。这非常依赖于操作系统。在我们的例子中,大约是30分钟之后,X-Server最终关闭了窗口。
这不依赖于操作系统。这正是当您没有要发送的流量时的标准行为,没有交换的数据包,因此不会进行检测(除非您的客户端-记住,这是希望在本地服务器中显示其数据的远程应用程序-激活SO_KEEPALIVE选项,并且在声明断开连接之前需要多次丢失)在您的情况下,时间量是可变的,因为计时器直到通过未插入的连接发送了一些数据时才会启动,这使得它是可变的(与操作系统无关)
另一方面,你不能假装服务器会打开你的监视器,以防你离开办公室,错误地或意外地关闭它。在这种情况下,容错规范是什么?
关于表示协议,一旦激活连接,应用程序就应该准备好向您显示有关系统的尽可能多的信息(但连接必须是允许失败的)。重要的是您为应用程序开发的方法是容错的,即使在您不在那里查看显示的情况下。会有人被告知没有人在看屏幕吗?在这种情况下,你会检测到运算符的缺失吗?不要认为这是火焰,但在这种情况下,常识应该是不可缺少的。
如果需要确保到远程主机的连接可用,则需要使用另一种方法进行检查。我建议您使用一个简单的应用程序来pinging远程主机并发出警报,以防您得不到肯定的结果。或者,您可以打开到服务器的连接,然后在从服务器获得肯定响应(例如,第一个数据包)时立即将其关闭。这将引导我们进入下一步,即确保有人正在查看(打开)显示屏的屏幕:)
例如,您可以与您感兴趣的客户端并行运行一个客户端,并通过在循环中请求某个服务器原子名称(或根窗口属性值)来强制心跳,但会有一些延迟。这将使连接失败,或者在某个可配置的时间内没有收到应答的情况下,您的客户端可以发出警报。
https://stackoverflow.com/questions/53816373
复制相似问题