Go语言中的Unix域套接字名称

5
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:可能是上述两种情况之一。

我的猜测正确吗?

1个回答

9

浏览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则是指顺序数据包套接字(即像数据报套接字一样发送数据包,但它们按顺序传递)。


我在stackoverflow上找到了关于SOCK_SEQPACKET的问题。 - diabloneo
将SEQPACKET视为STREAM,但是套接字上的每个recv操作都将对应于另一端的send。也就是说,写入边界在被另一方读取时将得到维护。 - James Henstridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接