这是不可能的。在分布式系统中众所周知,你不能相信在所有节点上都有相同的时钟。只有当你有像NTP这样的机制时,你才能拥有类似的时钟,但仍然存在时钟漂移(这取决于你可以忍受的错误)。即使你有相同的时钟,你也需要一种方法来确定数据包何时离开PC,而你没有。它是一个受控制的环境,或者你可能有未知的客户?您能容忍测量中的任何误差范围吗?我们是在谈论100毫秒还是少于10毫秒的时间?这些是解决您的问题的关键。
根据@progerz的评论添加信息到我的回复 如果NTP和几ms的时钟漂移适合你,那么你可能有一个机制去做你需要的。请记住,您拥有的环境越不受控制,这可能就不那么有用。例如,这可以在同一个数据中心内正常工作,而且在Wifi餐厅的连接客户端和数据中心的服务器之间的连接不太好。
关于修改UDP或TCP,如果你需要修改UDP头,基本上你正在实现一个新的协议,这是一种可能性,你需要给它分配一个新的协议号。您将无法使用数据报AF_INET套接字(或TCP流情况下的流套接字),您必须考虑使用较低级套接字(如原始套接字(或套接字套接字),但这不是必需的)。
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, your_new_protocol_number);
另一种方法是通过UDP或TCP创建应用层协议。在这种情况下,你将能够使用数据报/流套接字。
是的,但我必须得到服务器上的延迟,对于单独的数据包,无需发送响应!那是主要特征(和问题)。 – progerz
@progerz根据我的猜测编辑 – CrazyCasta
我不会低估,但推荐UDP或真正的任何“带外”计时机制都有一些问题。更明显的一点是,主流TCP流量和带外测量很可能分开进行。或者将通过插入的开关元件进行不同的处理。使用“流失(out-of-flow)”机制来说明特定流量的内容是很难说的。 – cnicutar