【问题标题】:Unix domain socket name in go languagego语言中的Unix域套接字名称
【发布时间】:2014-04-09 07:06:45
【问题描述】:

go 中的 net 包提供了这个功能:

func ResolveUnixAddr(net, addr string) (*UnixAddr, error)

字符串参数net给出网络名称,“unix”、“unixgram”或​​“unixpacket”。

我猜网络名称的含义为:

  • unixgram:作为 socket() 函数中的 SOCK_DGRAM 类型,由 net 包中的 ListenPacket() 使用。

  • unixpacket:作为 socket() 函数中的 SOCK_STREAM 类型,由 net 包中的 Listen() 使用。

  • unix:任一

我说的对吗?

【问题讨论】:

    标签: sockets unix go


    【解决方案1】:

    查看net/unixsock_posix.go 中的unixSocket 函数,我们有:

    var sotype int
    switch net {
    case "unix":
            sotype = syscall.SOCK_STREAM
    case "unixgram":
            sotype = syscall.SOCK_DGRAM
    case "unixpacket":
            sotype = syscall.SOCK_SEQPACKET
    default:
            return nil, UnknownNetworkError(net)
    }
    

    所以你说 unixgram 是一个数据报套接字是正确的,但是 unix 指的是流类型套接字,unixpacket 指的是顺序数据包套接字(即数据以数据包的形式发送)数据报套接字,但它们是按顺序传递的)。

    【讨论】:

    • 我为 SOCK_SEQPACKET 找到 question
    • 把 SEQPACKET 想象成 STREAM,但对套接字的每个recv 操作都会对应另一端的一个send。即对方读取时会保持写边界。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2017-02-06
    • 2010-11-02
    • 2014-06-02
    相关资源
    最近更新 更多