gpt4 book ai didi

c - recvmsg() 返回 "Resource temporarily unavailable"

转载 作者:太空宇宙 更新时间:2023-11-04 10:07:02 25 4
gpt4 key购买 nike

我正在使用 Linux 机器,并且正在发送 UDP 数据包。

我想为传输的数据包获取 NIC 上的硬件时间戳。我看过其他帖子并设置了适当的标志。

int flag = SOF_TIMESTAMPING_TX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE;

我正在使用:

int rc = recvmsg(fd, MSG_ERRQUEUE);

但是,recvmsg() 似乎返回“资源暂时不可用”。我在等待 50 微秒后调用此函数,并重试 5 次。我能够使用相同的代码获取硬件时间戳,但现在我遇到了这个问题而无需更改任何内容。

关于我应该调查什么可能导致此问题的任何想法?

最佳答案

linux/Documentation/networking/timestamping.txt 中,有一条关于从错误队列中读取传输时间戳的注释:

2.1.1.5 Blocking Read

Reading from the error queue is always a non-blocking operation. To block waiting on a timestamp, use poll or select. poll() will return POLLERR in pollfd.revents if any data is ready on the error queue. There is no need to pass this flag in pollfd.events. This flag is ignored on request. See also "man 2 poll".

因此,无论套接字是否处于非阻塞模式,如果错误队列为空(即,因为数据包尚未传输,所以时间戳尚未排队)。

我最好的猜测是你遇到了这样一种情况:无论出于何种原因(其他传出流量,可能是在线争用,等待 ARP 响应),数据包正在排队等待传输超过 50 微秒,所以你过早放弃而错过了时间戳。我建议使用更大的超时进行轮询,看看是否能解决问题。

关于c - recvmsg() 返回 "Resource temporarily unavailable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51833241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com