net包阅读摘记

61次阅读

共计 7863 个字符,预计需要花费 20 分钟才能阅读完成。

简介

在 net 包中有很多的结构体,各种函数各种方法。我自己决定总体上看一遍,然后做个导图。

复制粘贴来源:https://studygolang.com/stati…

常量

const (
    IPv4len = 4
    IPv6len = 16
)

全局变量

常用的 IPv4 地址。

var (IPv4bcast     = IPv4(255, 255, 255, 255) // 广播地址
    IPv4allsys    = IPv4(224, 0, 0, 1)       // 所有主机和路由器
    IPv4allrouter = IPv4(224, 0, 0, 2)       // 所有路由器
    IPv4zero      = IPv4(0, 0, 0, 0)         // 本地地址,只能作为源地址(曾用作广播地址))

很多 OpError 类型的错误会包含本错误。

var (ErrWriteToConnected = errors.New("use of WriteTo with pre-connected connection")
)

Error 接口

内嵌了 内置的 error,这意味这我们在处理 net 包的错误的时候,要记住 go net 包已经为我们封装这么一个错误接口。

type Error interface {
    error            // =>Error()string
    Timeout() bool   // 错误是否为超时?Temporary() bool // 错误是否是临时的?}

各种 Error 接口的实现类型

通过其命名可直观看出分别是哪类错误

  • UnknownNetworkError
type UnknownNetworkError string
  • InvalidAddrError
type InvalidAddrError string
  • DNSConfigError:DNSConfigError 代表读取主机 DNS 配置时出现的错误。
type DNSConfigError struct {Err error}

疑问:为什么这个结构体值包含一个内置错误接口类型,这样包装有何目的??

  • DNSError
type DNSError struct {
    Err       string // 错误的描述
    Name      string // 查询的名称
    Server    string // 使用的服务器
    IsTimeout bool
}
  • AddrError
type AddrError struct {
    Err  string
    Addr string
}
  • OpError(常用)

OpError 是经常被 net 包的函数返回的错误类型。它描述了该错误的操作、网络类型和网络地址。

type OpError struct {
    // Op 是出现错误的操作,如 "read" 或 "write"
    Op  string
    // Net 是错误所在的网络类型,如 "tcp" 或 "udp6"
    Net string
    // Addr 是出现错误的网络地址
    Addr Addr
    // Err 是操作中出现的错误
    Err error
}

HardwareAddr 类型

type HardwareAddr []byte

很明显,用来描述 mac 地址的。

  • 函数 ParseMAC:解析硬件地址
func ParseMAC(s string) (hw HardwareAddr, err error)
  • 方法 String
func (a HardwareAddr) String() string

Flags 类型: 接口的属性

type Flags uint
const (
    FlagUp           Flags = 1 << iota // 接口在活动状态
    FlagBroadcast                      // 接口支持广播
    FlagLoopback                       // 接口是环回的
    FlagPointToPoint                   // 接口是点对点的
    FlagMulticast                      // 接口支持组播
)
  • String 方法
func (f Flags) String() string

Interface 类型:描述网卡

描述的内容即是我们通过 ifconfig 输出的内容

type Interface struct {
    Index        int          // 索引,>= 1 的整数
    MTU          int          // 最大传输单元
    Name         string       // 接口名,例如 "en0"、"lo0"、"eth0.100"
    HardwareAddr HardwareAddr // 硬件地址,IEEE MAC-48、EUI-48 或 EUI-64 格式
    Flags        Flags        // 接口的属性,例如 FlagUp、FlagLoopback、FlagMulticast
}
  • InterfaceByIndex 函数:返回指定索引的网络接口
func InterfaceByIndex(index int) (*Interface, error)
  • InterfaceByName 函数:返回指定名字的网络接口。
func InterfaceByName(name string) (*Interface, error)
  • Interfaces 函数:返回该系统的网络接口列表
func Interfaces() ([]Interface, error)
  • InterfaceAddrs 函数:返回该系统的网络接口的地址列表
func InterfaceAddrs() ([]Addr, error)
  • Addrs 方法:返回网络接口 ifi 的一或多个接口地址
func (ifi *Interface) Addrs() ([]Addr, error)
  • MulticastAddrs 方法:返回网络接口 ifi 加入的多播组地址。
func (ifi *Interface) MulticastAddrs() ([]Addr, error)

Example:

func main() {infslice, _ := net.Interfaces()
    w := new(tabwriter.Writer).Init(os.Stdout, 8, 8, 3, ' ', 0)
    fmt.Fprintln(w, "Index\tName\tMac\tMTU\tFlags\tAddrs")
    for _, inf := range infslice {addr, _ := inf.Addrs()
        fmt.Fprintf(w, "%v\t%v\t%v\t%v\t%v\t%v\n", inf.Index, inf.Name, inf.HardwareAddr, inf.MTU, inf.Flags, addr)
    }
    w.Flush()}

IP 类型:描述 ipv4 或 ipv6 地址

注意: 开发中判断 IPV4 还是 IPV6 不能根据其切片长度

type IP []byte
  • IPv4 函数:返回包含一个 IPv4 地址 a.b.c.d 的 IP 地址(16 字节格式)。`
  • ParseIP 函数:将 s 解析为 IP 地址,并返回该地址。如果 s 不是合法的 IP 地址文本表示,ParseIP 会返回 nil。
  • DefaultMask 方法:返回 IP 地址 ip 的默认子网掩码。只有 IPv4 有默认子网掩码;如果 ip 不是合法的 IPv4 地址,会返回 nil。
  • Equal 方法:如果 ip 和 x 代表同一个 IP 地址,Equal 会返回真。代表同一地址的 IPv4 地址和 IPv6 地址也被认为是相等的。
  • Mask 方法:返回网络号
func IPv4(a, b, c, d byte) IP
func ParseIP(s string) IP
func (ip IP) DefaultMask() IPMask
func (ip IP) Equal(x IP) bool
func (ip IP) Mask(mask IPMask) IP

IPMask 类型:描述 IPv4 地址掩码

type IPMask []byte
  • IPv4Mask 函数:返回一个 4 字节格式的 IPv4 掩码 a.b.c.d。
  • CIDRMask 函数:返回一个 IPMask 类型值,该返回值总共有 bits 个字位,其中前 ones 个字位都是 1,其余字位都是 0。
  • Size 方法:返回 m 的前导的 1 字位数和总字位数。如果 m 不是规范的子网掩码(字位:/^1+0+$/),将返会(0, 0)。
func IPv4Mask(a, b, c, d byte) IPMask
func CIDRMask(ones, bits int) IPMask
func (m IPMask) Size() (ones, bits int)

IPNet 类型:表示一个 IP 网络(IP+MASK)

type IPNet struct {
    IP   IP     // 网络地址
    Mask IPMask // 子网掩码
}
  • ParseCIDR 函数:将 s 作为一个 CIDR(无类型域间路由)的 IP 地址和掩码字符串,如 ”192.168.100.1/24″ 或 ”2001:DB8::/48″,解析并返回 IP 地址和 IP 网络。对于 ”192.168.100.1/24″ 会返回 IP 地址 192.168.100.1 和 IP 网络 192.168.0.0/16。
  • Contains 函数:报告该网络是否包含地址 ip
  • Network 方法:返回网络类型名:”ip+net”。其实说白了就无论啥都返回这么一个字符串?
func ParseCIDR(s string) (IP, *IPNet, error)
func (n *IPNet) Contains(ip IP) bool
func (n *IPNet) Network() string

Addr 接口:代表一个网络中的终端地址

type Addr interface {Network() string // 网络名,eg:”tcp“String() string  // 字符串格式的地址,eg:”127.0.0.1:10999“}

Conn 接口:代表通用的 面向流 的网络连接

type Conn interface {
    // Read 从连接中读取数据
    // Read 方法可能会在超过某个固定时间限制后超时返回错误,该错误的 Timeout()方法返回真
    Read(b []byte) (n int, err error)
    // Write 从连接中写入数据
    // Write 方法可能会在超过某个固定时间限制后超时返回错误,该错误的 Timeout()方法返回真
    Write(b []byte) (n int, err error)
    // Close 方法关闭该连接
    // 并会导致任何阻塞中的 Read 或 Write 方法不再阻塞并返回错误
    Close() error
    // 返回本地网络地址
    LocalAddr() Addr
    // 返回远端网络地址
    RemoteAddr() Addr
    // 设定该连接的读写 deadline,等价于同时调用 SetReadDeadline 和 SetWriteDeadline
    // deadline 是一个绝对时间,超过该时间后 I / O 操作就会直接因超时失败返回而不会阻塞
    // deadline 对之后的所有 I / O 操作都起效,而不仅仅是下一次的读或写操作
    // 参数 t 为零值表示不设置期限
    SetDeadline(t time.Time) error
    // 设定该连接的读操作 deadline,参数 t 为零值表示不设置期限
    SetReadDeadline(t time.Time) error
    // 设定该连接的写操作 deadline,参数 t 为零值表示不设置期限
    // 即使写入超时,返回值 n 也可能 >0,说明成功写入了部分数据
    SetWriteDeadline(t time.Time) error
}
  • Dial 函数:在网络 network 上连接地址 address,并返回一个 Conn 接口
  • DialTimeout 函数:类似 Dial 但采用了超时。timeout 参数如果必要可包含名称解析。
  • Pipe 函数:创建一个内存中的同步、全双工网络连接。连接的两端都实现了 Conn 接口。一端的读取对应另一端的写入,直接将数据在两端之间作拷贝;没有内部缓冲。
// network:"tcp"、"tcp4"、"tcp6"、"udp"、"udp4"、"udp6"、"ip"、"ip4"、"ip6"、"unix"、"unixgram"、"unixpacket"
// address 支持域名,要提供端口
func Dial(network, address string) (Conn, error)
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
func Pipe() (Conn, Conn)

PacketConn 接口:代表通用的 面向数据包 的网络连接。

网络层

type PacketConn interface {
    // ReadFrom 方法从连接读取一个数据包,并将有效信息写入 b
    // ReadFrom 方法可能会在超过某个固定时间限制后超时返回错误,该错误的 Timeout()方法返回真
    // 返回写入的字节数和该数据包的来源地址
    ReadFrom(b []byte) (n int, addr Addr, err error)
    // WriteTo 方法将有效数据 b 写入一个数据包发送给 addr
    // WriteTo 方法可能会在超过某个固定时间限制后超时返回错误,该错误的 Timeout()方法返回真
    // 在面向数据包的连接中,写入超时非常罕见
    WriteTo(b []byte, addr Addr) (n int, err error)
    // Close 方法关闭该连接
    // 会导致任何阻塞中的 ReadFrom 或 WriteTo 方法不再阻塞并返回错误
    Close() error
    // 返回本地网络地址
    LocalAddr() Addr
    // 设定该连接的读写 deadline
    SetDeadline(t time.Time) error
    // 设定该连接的读操作 deadline,参数 t 为零值表示不设置期限
    // 如果时间到达 deadline,读操作就会直接因超时失败返回而不会阻塞
    SetReadDeadline(t time.Time) error
    // 设定该连接的写操作 deadline,参数 t 为零值表示不设置期限
    // 如果时间到达 deadline,写操作就会直接因超时失败返回而不会阻塞
    // 即使写入超时,返回值 n 也可能 >0,说明成功写入了部分数据
    SetWriteDeadline(t time.Time) error
}
  • ListenPacket 函数:监听本地网络地址 laddr。网络类型 net 必须是面向数据包的网络类型
// net:"ip"、"ip4"、"ip6"、"udp"、"udp4"、"udp6"、或 "unixgram"
// laddr 的格式参见 Dial 函数。func ListenPacket(net, laddr string) (PacketConn, error)

IPConn 类型:代表 IP 网络连接,实现了 Conn 和 PacketConn 接口

type IPConn struct {// 内含隐藏或非导出字段}

TCPConn 类型:代表一个 TCP 网络连接,实现了 Conn 接口。

type TCPConn struct {// 内含隐藏或非导出字段}

UDPConn 类型:UDPConn 代表一个 UDP 网络连接,实现了 Conn 和 PacketConn 接口。

type UDPConn struct {// 内含隐藏或非导出字段}

UnixConn 类型:代表 Unix 域 socket 连接,实现了 Conn 和 PacketConn 接口

type UnixConn struct {// 内含隐藏或非导出字段}

Dialer 类型:包含与某个地址建立连接时的参数

type Dialer struct {
    // Timeout 是 dial 操作等待连接建立的最大时长,默认值代表没有超时。// 如果 Deadline 字段也被设置了,dial 操作也可能更早失败。// 不管有没有设置超时,操作系统都可能强制执行它的超时设置。// 例如,TCP(系统)超时一般在 3 分钟左右。Timeout time.Duration
    // Deadline 是一个具体的时间点期限,超过该期限后,dial 操作就会失败。// 如果 Timeout 字段也被设置了,dial 操作也可能更早失败。// 零值表示没有期限,即遵守操作系统的超时设置。Deadline time.Time
    // LocalAddr 是 dial 一个地址时使用的本地地址。// 该地址必须是与 dial 的网络相容的类型。// 如果为 nil,将会自动选择一个本地地址。LocalAddr Addr
    // DualStack 允许单次 dial 操作在网络类型为 "tcp",// 且目的地是一个主机名的 DNS 记录具有多个地址时,// 尝试建立多个 IPv4 和 IPv6 连接,并返回第一个建立的连接。DualStack bool
    // KeepAlive 指定一个活动的网络连接的生命周期;如果为 0,会禁止 keep-alive。// 不支持 keep-alive 的网络连接会忽略本字段。KeepAlive time.Duration
}

每一个字段的零值都等价于没有该字段。因此调用 Dialer 零值的 Dial 方法等价于调用 Dial 函数。

  • Dial 方法:指定的网络上连接指定的地址。比 Dial 函数多了许多控制信息。
func (d *Dialer) Dial(network, address string) (Conn, error)

Listener 接口:用于 面向流 的网络协议的公用的网络监听器接口。

type Listener interface {
    // Addr 返回该接口的网络地址
    Addr() Addr
    // Accept 等待并返回下一个连接到该接口的连接
    Accept() (c Conn, err error)
    // Close 关闭该接口,并使任何阻塞的 Accept 操作都会不再阻塞并返回错误。Close() error}
  • Listen 函数:返回在一个本地网络地址 laddr 上监听的 Listener。网络类型参数 net 必须是面向流的网络
func Listen(net, laddr string) (Listener, error)

TCPListener 类型

TCPListener 代表一个 TCP 网络的监听者。使用者应尽量使用 Listener 接口而不是假设(网络连接为)TCP

type TCPListener struct {// 内含隐藏或非导出字段}

UnixListener 类型

UnixListener 代表一个 Unix 域 scoket 的监听者。使用者应尽量使用 Listener 接口而不是假设(网络连接为)Unix 域 scoket。

type UnixListener struct {// 内含隐藏或非导出字段}

IPAddr

type IPAddr struct {
    IP   IP
    Zone string // IPv6 范围寻址域
}
  • ResolveIPAddr 函数:将 addr 作为一个格式为 ”host” 或 ”ipv6-host%zone” 的 IP 地址来解析。函数会在参数 net 指定的网络类型上解析,net 必须是 ”ip”、”ip4″ 或 ”ip6″。
  • Network 方法:返回地址的网络类型:”ip”。
func ResolveIPAddr(net, addr string) (*IPAddr, error)
func (a *IPAddr) Network() string

TCPAddr 类型:代表一个 TCP 终端地址

type TCPAddr struct {
    IP   IP
    Port int
    Zone string // IPv6 范围寻址域
}
  • ResolveTCPAddr 函数:将 addr 作为 TCP 地址解析并返回。参数 addr 格式为 ”host:port” 或 ”[ipv6-host%zone]:port”,解析得到网络名和端口名;net 必须是 ”tcp”、”tcp4″ 或 ”tcp6″。
  • Network 方法:“tcp”

UDPAddr 类型:代表一个 UDP 终端地址

type UDPAddr struct {
    IP   IP
    Port int
    Zone string // IPv6 范围寻址域
}
  • ResolveTCPAddr 函数:将 addr 作为 TCP 地址解析并返回。参数 addr 格式为 ”host:port” 或 ”[ipv6-host%zone]:port”,解析得到网络名和端口名;net 必须是 ”udp”、”udp4″ 或 ”udp6″。
  • Network 方法:返回地址的网络类型,”udp”。

UnixAddr 类型:代表一个 Unix 域 socket 终端地址

正文完
 0