首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >recvmsg()返回“资源暂时不可用”

recvmsg()返回“资源暂时不可用”
EN

Stack Overflow用户
提问于 2018-08-14 03:18:27
回答 1查看 1.8K关注 0票数 0

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

我想在NIC上获得传输数据包的硬件时间戳。我看到了其他的帖子,并设置了适当的旗帜。

代码语言:javascript
复制
int flag = SOF_TIMESTAMPING_TX_HARDWARE | SOF_TIMESTAMPING_RAW_HARDWARE;

我在用:

代码语言:javascript
复制
int rc = recvmsg(fd, MSG_ERRQUEUE);

然而,recvmsg()似乎返回了"Resource temporarily unavailable"。我在等待50微秒后调用这个函数,然后重试5次。我能够用相同的代码获得硬件时间戳,但是现在我遇到了这个问题,而没有改变任何东西。

对于我应该调查什么可能导致这个问题,有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 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,因此您过早放弃了时间戳。我建议使用更大的超时来进行轮询,看看这是否解决了问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51833241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档