C#套接字,发送过程中经过的时间
我想知道是否有办法知道数据在网络上传输的时间 例如,我从计算机a向计算机B和C发送一个数据包(因此,根据距离等不同,每个数据包的运行时间可能不同),我想知道每个客户机发送和接收数据之间的时间(以便精确同步数据) 此外,重要的是要知道我的客户机必须在异步模式下工作(这不是问题) 有人知道怎么做吗C#套接字,发送过程中经过的时间,c#,synchronization,sockets,C#,Synchronization,Sockets,我想知道是否有办法知道数据在网络上传输的时间 例如,我从计算机a向计算机B和C发送一个数据包(因此,根据距离等不同,每个数据包的运行时间可能不同),我想知道每个客户机发送和接收数据之间的时间(以便精确同步数据) 此外,重要的是要知道我的客户机必须在异步模式下工作(这不是问题) 有人知道怎么做吗 KiTe.除非所有节点都有同步时钟,否则这几乎是不可能做到的。如果您确实有一个精确的同步机制,并且可以相信时钟是相同的,那么当您从a发送数据包时,您可以在数据包中插入一个时间戳,然后在C中将其与当前时间进
KiTe.除非所有节点都有同步时钟,否则这几乎是不可能做到的。如果您确实有一个精确的同步机制,并且可以相信时钟是相同的,那么当您从a发送数据包时,您可以在数据包中插入一个时间戳,然后在C中将其与当前时间进行比较 但同样,这种方法需要高分辨率的时间同步 如果您只想进行基准测试并了解平均时间,那么您可以做的是使数据包反弹回来。基本上,告诉C将相同的数据包发送回B,然后发送回A,在A中,您将原始时间戳与当前时间(将使用相同的时钟)进行比较。这将为您提供一个往返延迟,您可以将其除以2以获得单向延迟时间 如果您担心回发消息会增加开销,那么您可以执行以下一项(或两项)操作
对于您的分析,涉及到软件和硬件的几个不同层次,因此实现起来非常复杂。
在进行同步时,更重要的是要有一个可靠的密钥,如序列号-当您使用TCP时,当丢失一个包出现问题时,您会遇到一个很大的问题,因为这会触发对多个包的重新请求。问题是我需要相当高的发送/接收速率,因此,发送回数据肯定会减慢全局appp。我想知道他们在fps或rts这样的游戏中是怎么做的:即使有一个中央服务器充当主机之间的交换机,仍然会有延迟(可能达到数百毫秒),但基本上,当我用套接字发送数据包时,我不应该收到ACK吗?(因为我使用tcp套接字)然后我可以比较我得到ACK的时间和我发送数据的时间?但是对于.NET套接字,不可能这样做,因为“结束发送”或“发送”并不意味着对等方实际接收到的数据……我假设您所说的ACK在传输层,不一定符合您想要的ACK。您可以将数据包拆分为多个较低级别的数据包,每个数据包具有不同的ACK。做到这一点的唯一方法是自己实现ACK逻辑,使用一种类似于我在回答中描述的机制。如果你担心应用程序的速度会变慢,那么你可以将其设计为每10条消息只接收一次。我使用的是tcp,所以创建序列号应该没有用,对吗?但是,正如我刚才所问的,是否可以通过.NET获取tcp ack,以确保对等方接收到数据?然后应该更容易进行同步(我只需要存储时间差,在每次发送/确认接收时实现,等等),应用层只是假设在发送完成时将接收到它。如果客户响应,您可以猜测时间,但这是一个在一天中也会波动的猜测。