我正在使用Linux机器,并发送UDP数据包。
我想在NIC上获得传输数据包的硬件时间戳。我看到了其他的帖子,并设置了适当的旗帜。
int flag = SOF_TIMESTAMPING_TX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE;我在用:
int rc = recvmsg(fd, MSG_ERRQUEUE);然而,recvmsg()似乎返回了"Resource temporarily unavailable"。我在等待50微秒后调用这个函数,然后重试5次。我能够用相同的代码获得硬件时间戳,但是现在我遇到了这个问题,而没有改变任何东西。
对于我应该调查什么可能导致这个问题,有什么想法吗?
发布于 2018-08-14 05:26:40
在linux/Documentation/networking/timestamping.txt中,有关于从错误队列读取传输时间戳的说明:
2.1.1.5阻塞读 从错误队列中读取总是一种非阻塞操作.若要阻止等待时间戳,请使用轮询或选择。如果错误队列上有任何数据准备就绪,poll()将返回pollfd.revents中的POLLERR。没有必要在pollfd.events中传递此标志。如果请求,将忽略此标志。也见“男子2民意测验”。
因此,不管套接字是否处于非阻塞模式,如果错误队列为空(即,由于数据包尚未被传输,所以时间戳没有排队),您将得到指示的错误。
我最好的猜测是,您遇到的情况是,无论出于什么原因(其他传出流量,可能是线路上的争用,等待ARP响应),数据包正在排队等待传输超过50 50usec,因此您过早放弃了时间戳。我建议使用更大的超时来进行轮询,看看这是否解决了问题。
https://stackoverflow.com/questions/51833241
复制相似问题