net包--阅读摘记

l1nkkk · · 1172 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

简介

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

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

clipboard.png

常量

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()

}

clipboard.png

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终端地址


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:l1nkkk

查看原文:net包--阅读摘记

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1172 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传