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(或类似工具)看到这一点。感谢您提供全面的答案!我一定会对这些方法进行测试,看看效果如何。干杯