2014-04-09 99 views
3

包在旅途中提供了这种功能:Unix域套接字名

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

字符串参数net给人的网络名称, “UNIX”, “unixgram” 或 “unixpacket”。

我猜的网络名称的含义:

  • unixgram:在网包插座类型的SOCK_DGRAM()函数,通过ListenPacket使用()。

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

  • UNIX:要么

我说得对不对?

回答

6

综观net/unixsock_posix.gounixSocket功能,我们有:

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指一个连续的数据包套接字(即数据包与数据报套接字一样以数据包的形式发送,但它们按顺序传送)。

+0

我找到SOCK_SEQPACKET的[question](http://stackoverflow.com/questions/10104082/unix-socket-sock-seqpacket-vs-sock-dgram)。 – diabloneo

+0

想想像STREAM这样的SEQPACKET,但套接字上的每个'recv'操作都将对应于另一端的'send'。也就是说,写入边界将在对方读取时保持。 –