我正在尝试获取传出数据包的准确时间戳(使用原始套接字发送)。根据Linux/Documentation/networking/timestamping.txt
,“对于发送时间戳,传出的数据包将被附加到发送时间戳上并循环回套接字的错误队列。可以使用recvmsg(flags
= MSG_ERRQUEUE)进行接收。”
不幸的是,在原始套接字上调用时recvmsg
总是返回-1
(用socket(PF_INET, SOCK_RAW, IPPROTO_RAW)
和SO_TIMESTAMP
设置为1
with
来创建setsockopt
)。我究竟做错了什么?是否有更好的方法来获取传出数据包的准确时间戳?
附录(信息):
我还尝试从通过UDP套接字(下面的源代码)发送的数据包中获取时间戳并recvmsg
返回-1
:错误为“资源暂时不可用”(EAGAIN
)。
附录(源代码):
#include <arpa/inet.h>
#include <linux/net_tstamp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
void die(char* s)
{
perror(s);
exit(1);
}
int main(int argc, char* argv[])
{
char* destination_ip = "10.0.0.1";
int destination_port = 1234;
int sock;
if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
die("socket()");
}
int timestamp_flags = SOF_TIMESTAMPING_TX_SOFTWARE;
if (setsockopt(sock, SOL_SOCKET, SO_TIMESTAMPING, ×tamp_flags, sizeof(timestamp_flags)) < 0) {
die("setsockopt()");
}
struct sockaddr_in si_server;
memset(&si_server, 0, sizeof(si_server));
si_server.sin_family = AF_INET;
si_server.sin_port = htons(destination_port);
if (inet_aton(destination_ip, &si_server.sin_addr) == 0) {
die("inet_aton()");
}
const int buffer_len = 256;
char buffer[buffer_len];
const int n_packets = 10;
for (int i = 0; i < n_packets; ++i) {
sprintf(buffer, "Packet %d", i);
if (sendto(sock, buffer, buffer_len, 0, (const sockaddr*) &si_server, sizeof(si_server)) < 0) {
die("sendto()");
}
// Obtain the sent packet timestamp.
char data[256];
struct msghdr msg;
struct iovec entry;
struct sockaddr_in from_addr;
struct {
struct cmsghdr cm;
char control[512];
} control;
int res;
memset(&msg, 0, sizeof(msg));
msg.msg_iov = &entry;
msg.msg_iovlen = 1;
entry.iov_base = data;
entry.iov_len = sizeof(data);
msg.msg_name = (caddr_t)&from_addr;
msg.msg_namelen = sizeof(from_addr);
msg.msg_control = &control;
msg.msg_controllen = sizeof(control);
if (recvmsg(sock, &msg, MSG_ERRQUEUE) < 0) {
die("recvmsg()");
}
}
return 0;
}
查看Linux内核源代码,我发现负责将包含数据包时间戳的消息放入错误队列的函数为skb_tx_timestamp
。该功能应该由NIC驱动e1000
程序调用,但不幸的是,该驱动程序没有调用它(硬件时间戳记也有类似的功能,但这显然取决于NIC驱动程序是否支持)。
根据去年9月的NetDev讨论,“没有驱动程序调用skb_tx_timestamp()”和“您需要调整NIC驱动程序以使用此TX时间戳记”。添加skb_tx_timestamp
对e1000_xmit_frame
on
的调用之后e1000_main.c
,我能够(通过UDP套接字)获取传出数据包的时间戳。但是,我无法获得RAW套接字上传出数据包的时间戳(我仍然得到EAGAIN
)。
问题内容: 我想输出带有PST偏移量的时间戳(例如2008-11-13T13:23:30-08:00)。似乎没有以 hour:minute 格式输出时区偏移量,但排除了冒号。有没有一种简单的方法来获取Java中的时间戳? 另外,无法正确解析上述示例。它抛出一个。 问题答案: 从Java 7开始,提供了ISO8601时区的模式字符串。对于您描述的格式的字符串,请使用。请参阅文档。 样品: 结果:
任何一个都可以,要求数据是一个字符串化的JSON对象。我的查询将返回用户在给定时间范围内的所有数据。哪种模式更有意义,或者有更好的方法来解决这个问题?
说明 pika新版binlog有时间戳,开发binlog_sender工具,根据输入的时间段回放对应数据到某个pika实例 工具目录: pika/tools/binlog_tools/binlog_sender 使用参数: -h -- 显示帮助 -t -- l 显示日志类型,old 或new -i -- pika实例的ip -p -- pika实例的port -n -- 输入的binlog的路径
我正尝试从FFMPEG向输出文件添加时间戳,但出现此错误。 我犯错的地方? 感谢所有回复:)
我在一个Kafka主题“原始数据”中获取CSV,目标是通过在另一个主题“数据”中发送具有正确时间戳(每行不同)的每行来转换它们。 null 我想通过直接设置时间戳来删除这个“内部”主题的使用,但我找不到一个方法(时间戳提取器只在消耗时间使用)。 我在文档中偶然发现了这一行: 请注意,通过调用#forward()时显式地为输出记录分配时间戳,可以在处理器API中更改description默认行为。
有两个这样的数据帧(示例) df1 df2 然后,我想加入df1和df2,但是我不知道如何做到这一点,因为在第二个df中我只有开始和结束时间。如何根据第二个df的数据将条件放在第一个df上? 这就是我想要的