linux的tcp时间戳,Linux套接字的Linux时间戳

我正在一个项目中工作,以便从文件Linux时间戳记中提到的用于TCP套接字的NIC获取接收和传输 时间戳.但所有文档和测试编码都是针对UDP套接字完成的.但我正在获取NIC的传输时间戳,而不是获取接收TCP数据包的时间戳.

我的界面支持以下时间戳

Time stamping parameters for enp4s0:

Capabilities:

hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)

software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)

hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)

software-receive (SOF_TIMESTAMPING_RX_SOFTWARE)

software-system-clock (SOF_TIMESTAMPING_SOFTWARE)

hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)

PTP Hardware Clock: 3

Hardware Transmit Timestamp Modes:

off (HWTSTAMP_TX_OFF)

on (HWTSTAMP_TX_ON)

Hardware Receive Filter Modes:

none (HWTSTAMP_FILTER_NONE)

all (HWTSTAMP_FILTER_ALL)

我启用网卡时间戳后bind()用ioctl(sockfd, SIOCSHWTSTAMP, &net_device);用

memset(&net_device, 0, sizeof(net_device));

strncpy(net_device.ifr_name, interface_name, sizeof(net_device.ifr_name));

net_device.ifr_data = (void *)&tstconfig;

memset(&tstconfig, 0, sizeof(tstconfig));

tstconfig.tx_type = HWTSTAMP_TX_OFF;

tstconfig.rx_filter = HWTSTAMP_FILTER_ALL;

然后启用NIC中的时间戳 setsockopt()

int opt= 0;

opt |= SOF_TIMESTAMPING_RX_HARDWARE;

opt |= SOF_TIMESTAMPING_RAW_HARDWARE;

if (setsockopt(sockfd, SOL_SOCKET, SO_TIMESTAMPING,

(char *)&opt, sizeof(opt))) {

error(1, 0, "setsockopt timestamping");

bail("setsockopt SO_TIMESTAMPING");

}

后听()和accept(),我做的select(),并检查是否fd被rfds随后致电recvmsg()与下列选项

int rc;

struct iovec vec[1];

struct msghdr msg;

char data[8192];

struct cmsghdr *cmsg;

union {

struct cmsghdr cm;

char control[256];

} cmsg_un;

vec[0].iov_base = data;

vec[0].iov_len = sizeof(data);

memset(&msg, 0, sizeof(msg));

memset(&from_addr, 0, sizeof(from_addr));

memset(&cmsg_un, 0, sizeof(cmsg_un));

msg.msg_name = NULL;

msg.msg_namelen = 0;

msg.msg_iov = vec;

msg.msg_iovlen = 1;

msg.msg_control = cmsg_un.control;

msg.msg_controllen = sizeof(cmsg_un.control);

rc = recvmsg(flow->fd, &msg, 0);

printf("tried reading %d bytes, got %d", bytes, rc);

if (msg.msg_flags & MSG_TRUNC) {

printf("received truncated message\n");

return 0;

}

if (msg.msg_flags & MSG_CTRUNC) {

printf("received truncated ancillary data\n");

return 0;

}

if (msg.msg_controllen <= 0) {

printf("`received short ancillary data (%ld/%ld)`\n",

(long)msg.msg_controllen, (long)sizeof(cmsg_un.control));

return 0;

}

但我总是得到以下消息,

received short ancillary data (0/256)

我没有从中获取辅助数据recvmsg(),我想知道linux是否支持TCP接收NIC的硬件时间戳.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值