C#/理论-如何确定*两台计算机之间的事件需要多长时间*

时间:2018-09-19 14:29:10

标签: c# networking runtime server-communication

我会尽力解释这种情况,但是如果我不清楚,请提出任何问题。

我的情况:我有两台计算机,A和B。在计算机A上,我有一个查看数据库并将其显示给用户的程序。在计算机B上,我有一个程序,用户进行的各种操作会导致数据最终最终存储在上述数据库中(通过许多第三方应用程序进行的间接过程)。

我的“目标”:我需要从对B进行操作的时间算起,我需要多长时间才能从A上的程序访问该数据。理想情况下,我需要缩小此范围误差低至50ms。

工具:

  • 计算机A和B共享本地连接
  • 他们可以通过TCP进行通信,而我之前已经使用C#进行了这种通信。我知道说的不准确,但是我们可以有效地将通讯时间B-> A和A-> B视为常数(但每个方向都是他们自己的常数)
  • 他们可以访问共享的NTFS格式的网络驱动器。
  • 我可以在动作执行时在B上忽略不计(为此目的,O(n)实际上为零)
  • 我可以说到可以忽略的程度(将O(n)设为零)从A中的程序/数据库可以访问值。

约束/路障

  • 计算机B无法访问互联网
  • 即使当前看起来是同步的,也不能相信时钟是同步的。我已经看到两台计算机上的时钟彼此间隔几分钟。我不知道如何确定网络驱动器上的时间戳。
  • 虽然有效地进行TCP通讯的时间对我来说是恒定的,但我不知道这些常数(A-> B和B-> A)是什么或如何测量它们。
  • 操作和检索发生在第三方程序中,该数据库反映了另一个数据库,我无法访问这些值处于打开状态的服务器。
  • (编辑/添加)计算机B 不知道何时将数据降落到数据库中,仅当触发将数据放到数据库中时才知道。

我认为这最终导致了某种数学问题,我将以某种方式对每台计算机内的消息使用时间戳的差异,而不是比较计算机之间的时间戳。因此,更多的是测量TCP通信工作需要多长时间,而不是查看该过程需要多长时间。如果有,我可以在事件发生时将消息从B发送到A,当数据可用时将消息从A发送到B,然后减去通信时间。如果这是我最好的选择,那么我实际上或从理论上都不知道如何设置它,因为我不能相信他们自己的时间戳。

此外,尽管我非常感谢一些答复/答案/想法-坦白地说,这是出于我的利益,因为我可以清楚地描述和思考该问题。此外,我找不到该问题的答案,因此希望在其他人遇到类似问题的情况下会弹出该问题。

1 个答案:

答案 0 :(得分:0)

我无法从您写的内容中获得您的实际环境,但是:

基本要求是

  • 具有A和B可以访问的共享时间服务器。
  • 为B产生的事件/记录分配时间。
  • 在A上查找事件/记录的时间。

如果我不能提供其中之一,那就没有办法解决。

如果本地计算机时间不能足够准确地同步,则需要设置自己的时间服务器。我会:

编写一个在B上运行的时间服务器,例如使用Win32 :: GetTickCount作为当前时间。

使B的当前时间可以通过tcp连接(或更准确地说是串行连接)访问A。

将时间存储在B上产生的记录/事件中

在A上检测到新的记录/事件时,从记录获取时间,并通过TCP连接从B获取当前时间。

不同的时间并获得结果。 (其中没有什么大数学)

您还可以使用网络驱动器作为传输当前时间的通道,但是我想同步文件访问有点棘手。我猜想TCP连接更容易建立。

也许从NAS使用“ LastWriteTime”可能是获取共享时间的另一种方法。如果一切正常,您可以连续在B上写一个文件,并在A上获取文件的LAstWriteTimeSTamp。这可能是您的时间服务器。

您可能想阅读有关在两台计算机之间建立TCP连接的信息,或研究如何分配/请求NAS中文件的LAstWriteTimestamp。

类似: 在B上:File.WriteAllText(“ \ nas \ timestamp.txt”,Guid.NewGuid()); 在A上:aTimeStamp = new FileInfo(“ \ nas \ timestamp.txt”)。LastWriteTime可能是LAstWriteTimeUTC。

您需要检查LastWriteTime和通过nas的延迟是否足够精确。

希望能有所帮助。