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

时间:2018-08-14 03:18:28

标签: c linux

我正在使用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次。 我能够使用相同的代码获得硬件时间戳,但是现在却遇到了这个问题,而没有进行任何更改。

关于我应该研究的任何想法可能导致此问题?

1 个答案:

答案 0 :(得分:1)

db.collection.bulkWrite( [ { updateOne : { "filter" : {id : { "$in": arrIds}}, "update" : <Your Doc>, "upsert" : true } } ] ) 中,有一条关于从错误队列中读取传输时间戳的注释:

  

2.1.1.5阻止读取

     

从错误队列中读取数据始终是非阻塞操作。至       阻止等待时间戳,请使用轮询或选择。 poll()将返回       pollfd.revent中的POLLERR在错误队列上是否准备好任何数据。       无需在pollfd.events中传递此标志。这个标志是       根据要求被忽略。另请参阅“男人2民意测验”。

因此,无论套接字是否处于非阻塞模式,如果错误队列为空(例如,由于尚未传输数据包,那么看起来都会收到指示的错误)。时间戳尚未排队)。

我的最佳猜测是,由于某种原因(其他传出流量,可能是网络争用,正在等待ARP响应),数据包正在排队等待传输超过50usec。由于太早放弃而错过了时间戳记。我建议使用较大的超时进行轮询,看看是否可以解决问题。