简介
在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终端地址
有疑问加站长微信联系(非本文作者)