我是 golang 和套接字编程的新手。我尝试使用 cmsg 发送消息,但在调用
syscall.Sendmsg()
时,错误不断显示为“无效参数”。我确信没有 cmsgBytes
,通话也能正常工作。
...
cmsg := syscall.Cmsghdr{}
cmsg.Level = syscall.SOL_SOCKET
cmsg.Type = syscall.SO_TIMESTAMPING
cmsg.Len = uint64(syscall.CmsgLen(0))
cmsgBytes := (*[unsafe.Sizeof(cmsg)]byte)(unsafe.Pointer(&cmsg))[:]
if err := syscall.Sendmsg(fd, pkt, cmsgBytes, dstAddr, 0); err != nil {
return time.Time{}, err
}
请告诉我一些使用
SO_TIMESTAMPING
发送 cmsg 数据的示例或任何可以帮助的内容。
要访问时间戳信息,您应该首先发送不带任何 cmsg 结构的消息,然后使用指定了 MSG_ERRQUEUE 标志的 recvmsg 调用从套接字错误缓冲区中提取它 https://docs.kernel.org/networking/timestamping.html#transmit-timestamps-with-msg-errqueue