golang 中 SendMsg() cmsg 的参数无效

问题描述 投票:0回答:1

我是 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 数据的示例或任何可以帮助的内容。

go sockets timestamp
1个回答
0
投票

要访问时间戳信息,您应该首先发送不带任何 cmsg 结构的消息,然后使用指定了 MSG_ERRQUEUE 标志的 recvmsg 调用从套接字错误缓冲区中提取它 https://docs.kernel.org/networking/timestamping.html#transmit-timestamps-with-msg-errqueue

© www.soinside.com 2019 - 2024. All rights reserved.