net包中按实体分层分为mac,ip,tcp,udp,unix.按逻辑有Listener,Conn,Resolver
实体分层
mac
1 | struct: |
ip
1 | struct:4字节的IPV4地址,16字节的 IPV6地址 |
比较简单,不赘述
逻辑分层
Addr
1 | 接口:实现Network与String两个函数 |
IPAddr
1 | type IPAddr struct { |
TCPAddr
1 | type TCPAddr struct { |
同理,通过该函数返回TCPAddr类型
func ResolveTCPAddr(network, address string) (*TCPAddr, error)
Conn
1 | type Conn interface { |
func Dial(network, address string) (Conn, error)
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
后者是前者的一个特例,加了超时时间,超时控制也是使用context包实现
需要注意的一点是阻塞相关的系统调用在底层也是起单独的goroutine实现
IPConn
1 | type IPConn struct { |
TCPConn
1 | type TCPConn struct { |
如下函数返回一个 TCPConn
func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error)
Listener
1 | type Listener interface { |
通过如下函数返回一个TCPListener
func ListenTCP(network string, laddr *TCPAddr) (*TCPListener, error)
通过如下函数返回一个TCPConn
func (l *TCPListener) AcceptTCP() (*TCPConn, error)
UDP,Unix
UDP,Unix同理.UDPConn,UDPAddr,由于UDP不需要Accept这一步骤故没有UDPListener
UnixConn,UnixAddr,UnixListener同上