golang的net包

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

package net

import "net"

net包提供了可移植的网络I/O接口,包括TCP/IPUDP、域名解析和Unixsocket

虽然本包提供了对网络原语的访问,大部分使用者只需要DialListenAccept函数提供的基本接口;以及相关的ConnListener接口。crypto/tls包提供了相同的接口和类似的DialListen函数。

Dial函数和服务端建立连接:

conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
	// handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
// ...

Listen函数创建的服务端:

ln, err := net.Listen("tcp", ":8080")
if err != nil {
	// handle error
}
for {
	conn, err := ln.Accept()
	if err != nil {
		// handle error
		continue
	}
	go handleConnection(conn)
}

Index

Examples

Constants

const ( IPv4len = 4 IPv6len = 16
)

IP address lengths (bytes).

Variables

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) // 本地地址,只能作为源地址(曾用作广播地址) )

常用的IPv4地址。

var ( IPv6zero = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} IPv6unspecified = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} IPv6loopback = IP{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1} IPv6interfacelocalallnodes = IP{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01} IPv6linklocalallnodes = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01} IPv6linklocalallrouters = IP{0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}
)

常用的IPv6地址。

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

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

type ParseError

type ParseError struct { Type string Text string }

ParseError代表一个格式错误的字符串,Type为期望的格式。

func (*ParseError) Error

func (e *ParseError) Error() string

type Error

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

Error代表一个网络错误。

type UnknownNetworkError

type UnknownNetworkError string

func (UnknownNetworkError) Error

func (e UnknownNetworkError) Error() string

func (UnknownNetworkError) Temporary

func (e UnknownNetworkError) Temporary() bool

func (UnknownNetworkError) Timeout

func (e UnknownNetworkError) Timeout() bool

type InvalidAddrError

type InvalidAddrError string

func (InvalidAddrError) Error

func (e InvalidAddrError) Error() string

func (InvalidAddrError) Temporary

func (e InvalidAddrError) Temporary() bool

func (InvalidAddrError) Timeout

func (e InvalidAddrError) Timeout() bool

type DNSConfigError

type DNSConfigError struct { Err error }

DNSConfigError代表读取主机DNS配置时出现的错误。

func (*DNSConfigError) Error

func (e *DNSConfigError) Error() string

func (*DNSConfigError) Temporary

func (e *DNSConfigError) Temporary() bool

func (*DNSConfigError) Timeout

func (e *DNSConfigError) Timeout() bool

type DNSError

type DNSError struct { Err string // 错误的描述 Name string // 查询的名称 Server string // 使用的服务器 IsTimeout bool }

DNSError代表DNS查询的错误。

func (*DNSError) Error

func (e *DNSError) Error() string

func (*DNSError) Temporary

func (e *DNSError) Temporary() bool

func (*DNSError) Timeout

func (e *DNSError) Timeout() bool

type AddrError

type AddrError struct { Err string Addr string }

func (*AddrError) Error

func (e *AddrError) Error() string

func (*AddrError) Temporary

func (e *AddrError) Temporary() bool

func (*AddrError) Timeout

func (e *AddrError) Timeout() bool

type OpError

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

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

func (*OpError) Error

func (e *OpError) Error() string

func (*OpError) Temporary

func (e *OpError) Temporary() bool

func (*OpError) Timeout

func (e *OpError) Timeout() bool

func SplitHostPort

func SplitHostPort(hostport string) (host, port string, err error)

函数将格式为"host:port""[host]:port""[ipv6-host%zone]:port"的网络地址分割为hostipv6-host%zoneport两个部分。Ipv6的文字地址或者主机名必须用方括号括起来,如"[::1]:80""[ipv6-host]:http""[ipv6-host%zone]:80"

func JoinHostPort

func JoinHostPort(host, port string) string

函数将hostport合并为一个网络地址。一般格式为"host:port";如果host含有冒号或百分号,格式为"[host]:port"

type HardwareAddr

type HardwareAddr []byte

HardwareAddr类型代表一个硬件地址(MAC地址)。

func ParseMAC

func ParseMAC(s string) (hw HardwareAddr, err error)

ParseMAC函数使用如下格式解析一个IEEE 802 MAC-48EUI-48EUI-64硬件地址:

01:23:45:67:89:ab
01:23:45:67:89:ab:cd:ef
01-23-45-67-89-ab
01-23-45-67-89-ab-cd-ef
0123.4567.89ab
0123.4567.89ab.cdef

func (HardwareAddr) String

func (a HardwareAddr) String() string

type Flags

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

func (Flags) String

func (f Flags) String() string

type Interface

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 }

Interface类型代表一个网络接口(系统与网络的一个接点)。包含接口索引到名字的映射,也包含接口的设备信息。

func InterfaceByIndex

func InterfaceByIndex(index int) (*Interface, error)

InterfaceByIndex返回指定索引的网络接口。

func InterfaceByName

func InterfaceByName(name string) (*Interface, error)

InterfaceByName返回指定名字的网络接口。

func (*Interface) Addrs

func (ifi *Interface) Addrs() ([]Addr, error)

Addrs方法返回网络接口ifi的一或多个接口地址。

func (*Interface) MulticastAddrs

func (ifi *Interface) MulticastAddrs() ([]Addr, error)

MulticastAddrs返回网络接口ifi加入的多播组地址。

func Interfaces

func Interfaces() ([]Interface, error)

Interfaces返回该系统的网络接口列表。

func InterfaceAddrs

func InterfaceAddrs() ([]Addr, error)

InterfaceAddrs返回该系统的网络接口的地址列表。

type IP

type IP []byte

IP类型是代表单个IP地址的[]byte切片。本包的函数都可以接受4字节(IPv4)和16字节(IPv6)的切片作为输入。

注意,IP地址是IPv4地址还是IPv6地址是语义上的属性,而不取决于切片的长度:16字节的切片也可以是IPv4地址。

func IPv4

func IPv4(a, b, c, d byte) IP

IPv4返回包含一个IPv4地址a.b.c.dIP地址(16字节格式)。

func ParseIP

func ParseIP(s string) IP

ParseIPs解析为IP地址,并返回该地址。如果s不是合法的IP地址文本表示,ParseIP会返回nil

字符串可以是小数点分隔的IPv4格式(如"74.125.19.99")或IPv6格式(如"2001:4860:0:2001::68")格式。

func (IP) IsGlobalUnicast

func (ip IP) IsGlobalUnicast() bool

如果ip是全局单播地址,则返回真。

func (IP) IsLinkLocalUnicast

func (ip IP) IsLinkLocalUnicast() bool

如果ip是链路本地单播地址,则返回真。

func (IP) IsInterfaceLocalMulticast

func (ip IP) IsInterfaceLocalMulticast() bool

如果ip是接口本地组播地址,则返回真。

func (IP) IsLinkLocalMulticast

func (ip IP) IsLinkLocalMulticast() bool

如果ip是链路本地组播地址,则返回真。

func (IP) IsMulticast

func (ip IP) IsMulticast() bool

如果ip是组播地址,则返回真。

func (IP) IsLoopback

func (ip IP) IsLoopback() bool

如果ip是环回地址,则返回真。

func (IP) IsUnspecified

func (ip IP) IsUnspecified() bool

如果ip是未指定地址,则返回真。

func (IP) DefaultMask

func (ip IP) DefaultMask() IPMask

函数返回IP地址ip的默认子网掩码。只有IPv4有默认子网掩码;如果ip不是合法的IPv4地址,会返回nil

func (IP) Equal

func (ip IP) Equal(x IP) bool

如果ipx代表同一个IP地址,Equal会返回真。代表同一地址的IPv4地址和IPv6地址也被认为是相等的。

func (IP) To16

func (ip IP) To16() IP

To16将一个IP地址转换为16字节表示。如果ip不是一个IP地址(长度错误),To16会返回nil

func (IP) To4

func (ip IP) To4() IP

To4将一个IPv4地址转换为4字节表示。如果ip不是IPv4地址,To4会返回nil

func (IP) Mask

func (ip IP) Mask(mask IPMask) IP

Mask方法认为maskip的子网掩码,返回ip的网络地址部分的ip。(主机地址部分都置0

func (IP) String

func (ip IP) String() string

String返回IP地址ip的字符串表示。如果ipIPv4地址,返回值的格式为点分隔的,如"74.125.19.99";否则表示为IPv6格式,如"2001:4860:0:2001::68"

func (IP) MarshalText

func (ip IP) MarshalText() ([]byte, error)

MarshalText实现了encoding.TextMarshaler接口,返回值和String方法一样。

func (*IP) UnmarshalText

func (ip *IP) UnmarshalText(text []byte) error

UnmarshalText实现了encoding.TextUnmarshaler接口。IP地址字符串应该是ParseIP函数可以接受的格式。

type IPMask

type IPMask []byte

IPMask代表一个IP地址的掩码。

func IPv4Mask

func IPv4Mask(a, b, c, d byte) IPMask

IPv4Mask返回一个4字节格式的IPv4掩码a.b.c.d

func CIDRMask

func CIDRMask(ones, bits int) IPMask

CIDRMask返回一个IPMask类型值,该返回值总共有bits个字位,其中前ones个字位都是1,其余字位都是0

func (IPMask) Size

func (m IPMask) Size() (ones, bits int)

Size返回m的前导的1字位数和总字位数。如果m不是规范的子网掩码(字位:/^1+0+$/),将返会(0, 0)

func (IPMask) String

func (m IPMask) String() string

String返回m的十六进制格式,没有标点。

type IPNet

type IPNet struct { IP IP // 网络地址 Mask IPMask // 子网掩码 }

IPNet表示一个IP网络。

func ParseCIDR

func ParseCIDR(s string) (IP, *IPNet, error)

ParseCIDRs作为一个CIDR(无类型域间路由)的IP地址和掩码字符串,如"192.168.100.1/24""2001:DB8::/48",解析并返回IP地址和IP网络,参见RFC 4632RFC 4291

本函数会返回IP地址和该IP所在的网络和掩码。例如,ParseCIDR("192.168.100.1/16")会返回IP地址192.168.100.1IP网络192.168.0.0/16

func (*IPNet) Contains

func (n *IPNet) Contains(ip IP) bool

Contains报告该网络是否包含地址ip

func (*IPNet) Network

func (n *IPNet) Network() string

Network返回网络类型名:"ip+net",注意该类型名是不合法的。

func (*IPNet) String

func (n *IPNet) String() string

String返回nCIDR表示,如"192.168.100.1/24""2001:DB8::/48",参见RFC 4632RFC 4291。如果nMask字段不是规范格式,它会返回一个包含n.IP.String()、斜线、n.Mask.String()(此时表示为无标点十六进制格式)的字符串,如"192.168.100.1/c000ff00"

type Addr

type Addr interface { Network() string // 网络名 String() string // 字符串格式的地址 }

Addr代表一个网络终端地址。

type 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方法关闭该连接 // 并会导致任何阻塞中的ReadWrite方法不再阻塞并返回错误 Close() error // 返回本地网络地址 LocalAddr() Addr // 返回远端网络地址 RemoteAddr() Addr // 设定该连接的读写deadline,等价于同时调用SetReadDeadlineSetWriteDeadline // 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 }

Conn接口代表通用的面向流的网络连接。多个线程可能会同时调用同一个Conn的方法。

func Dial

func Dial(network, address string) (Conn, error)

在网络network上连接地址address,并返回一个Conn接口。可用的网络类型有:

"tcp""tcp4""tcp6"

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

本文来自:开源中国博客

感谢作者:刘地

查看原文:golang的net包

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

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