我正在使用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次。
我能够使用相同的代码获得硬件时间戳,但是现在却遇到了这个问题,而没有进行任何更改。
关于我应该研究的任何想法可能导致此问题?
答案 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。由于太早放弃而错过了时间戳记。我建议使用较大的超时进行轮询,看看是否可以解决问题。