Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定数据包从发送到接收需要多长时间的可靠方法是什么?_C#_Networking_Timestamp - Fatal编程技术网

C# 确定数据包从发送到接收需要多长时间的可靠方法是什么?

C# 确定数据包从发送到接收需要多长时间的可靠方法是什么?,c#,networking,timestamp,C#,Networking,Timestamp,我试图确定从client1->server->client2发送数据包需要多长时间才能考虑延迟补偿。然而,似乎本地时间不可依赖。我和一个朋友做了一些测试,由于某种原因,他的机器时间(秒)缩短了5秒(他落后了5秒)。当检查DateTime.UtcNow()时,除了秒之外,所有的东西都是一样的,我想知道是否有人知道为什么会这样,以及是否有更好的方法来解决这个问题?似乎将时间戳附加到数据包的有效负载上,并将其与接收时进行比较是不可靠的 非常感谢您的帮助 我想我理解您的意图,如果您想测量数据包的飞行时间

我试图确定从
client1->server->client2
发送数据包需要多长时间才能考虑延迟补偿。然而,似乎本地时间不可依赖。我和一个朋友做了一些测试,由于某种原因,他的机器时间(秒)缩短了5秒(他落后了5秒)。当检查
DateTime.UtcNow()
时,除了秒之外,所有的东西都是一样的,我想知道是否有人知道为什么会这样,以及是否有更好的方法来解决这个问题?似乎将时间戳附加到数据包的有效负载上,并将其与接收时进行比较是不可靠的


非常感谢您的帮助

我想我理解您的意图,如果您想测量数据包的飞行时间,需要设置一个受控环境

方法1

向服务器设置乒乓球,在数据包上贴上时间戳,然后让服务器将数据包回显给您。作为时间戳使用,您将获得非常高的精确度

客户端1->服务器->客户端1

方法2

时间同步,如果您都在运行windows服务器,最简单的方法是右键单击任务栏中的时间,选择“调整日期/时间”,然后单击“立即同步”按钮。 如果要编写脚本,可以使用powershell运行

Start-Process cmd -ArgumentList '/s,/c,C:\Windows\System32\net.exe start w32time & w32tm /resync' -Verb runAs
这将迫使每个服务器与时间服务器同步,这并不完美,但您将获得时间的大致概念。在数据包上放置一个Ticks值,并让客户端2将其与它们的Ticks进行比较

备选方案

我认为更好的选择是让每个客户机测量其对服务器的延迟,即

客户端1->服务器->客户端1=>测量往返时间

客户端2->服务器->客户端2=>测量往返时间

客户端1->服务器->客户端2=>客户端1告诉客户端2其服务器延迟

客户端2->服务器->客户端1=>客户端2告诉客户端1其服务器延迟


此时,客户机1和2应该会猜测一个数据包需要多长时间。您需要定期执行此测试,因为互联网是一个不断变化的野兽。

谢谢我修改了我的帖子,是的,我将时间戳作为有效负载的一部分发送。。TCP实际上有一个时间戳。其概念是,发送方发送一个具有自己时间戳值(不一定是表示日期/时间的值)的数据包,接收方将其回显并添加自己的时间戳值。不过,计算的是往返值:发送方计算自己的值,接收方也计算自己的值。所以你不需要同步时钟。。。您可以通过Wireshark(或类似工具)看到这一点。感谢您提供全面的答案!我一定会对这些方法进行测试,看看效果如何。干杯