Go中net包中的方法

本文章是学习Go中net包的一篇笔记,记录 net 包的一些方法的使用。

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

函数将格式为”host:port”、”[host]:port”或”[ipv6-host%zone]:port”的网络地址分割为host或ipv6-host%zone和port两个部分。

2、func JoinHostPort(host, port string) string

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

 3、type HardwareAddr []byte

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

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

ParseMAC函数使用如下格式解析一个IEEE 802 MAC-48、EUI-48或EUI-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

3.2、func (a HardwareAddr) String() string

4、网卡的状态标识

type Flags uint
const (
    FlagUp           Flags = 1 << iota // 接口在活动状态  1
    FlagBroadcast                      // 接口支持广播    2 
    FlagLoopback                       // 接口是环回的    4
    FlagPointToPoint                   // 接口是点对点的  8 可以理解为单播
    FlagMulticast                      // 接口支持组播    16 和多播同义
)
var flagNames = []string{
   "up",
   "broadcast",
   "loopback",
   "pointtopoint",
   "multicast",
}

4.1 func (f Flags) String() string

5、网卡的相关的方法

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
}

5.1、func Interfaces() ([]Interface, error)

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

例如:(输出结果为了现实方便,使用json输出)

[
  {
    "Index": 1,
    "MTU": 16384,
    "Name": "lo0",
    "HardwareAddr": null,
    "Flags": 21 //相当于 up|loopback|multicast ,网卡使用中,支持环回、组播
  },
  {
    "Index": 9,
    "MTU": 1484,
    "Name": "awdl0",
    "HardwareAddr": "yvQEMXJ1",
    "Flags": 18 //相当于broadcast|multicast,网卡未使用,支持广播、组播
  },
  {
    "Index": 5,
    "MTU": 1500,
    "Name": "en4",
    "HardwareAddr": "aFs1niJI",
    "Flags": 19 //相当于 up|broadcast|multicast,网卡使用中,支持广播、组播
  }
]

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

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

例如:

interfaces,_ := net.InterfaceByIndex(5)
json , _ := json.Marshal(interfaces)

输出:
{
  "Index": 5,
  "MTU": 1500,
  "Name": "en4",
  "HardwareAddr": "aFs1niJI",
  "Flags": 19
}

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

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

interfaces,_ := net.InterfaceByName("awdl0")
json , _ := json.Marshal(interfaces)

输出:
{
  "Index": 9,
  "MTU": 1484,
  "Name": "awdl0",
  "HardwareAddr": "yvQEMXJ1",
  "Flags": 18
}

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

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

inter,_ := net.InterfaceByIndex(5)
addrs, _ := inter.Addrs()
fmt.Println(addrs)

输出:
[fe80::6a5b:35ff:fe9e:2248/64 10.1.81.38/23]

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

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

inter,_ := net.InterfaceByIndex(5)
addrs, _ := inter.MulticastAddrs()
json , _ := json.Marshal(addrs)
fmt.Fprintf(c.Writer, string(json))

输出:
[
  {
    "IP": "224.0.0.251",
    "Zone": ""
  }, {
    "IP": "ff02::fb",
    "Zone": ""
  },{
    "IP": "224.0.0.1",
    "Zone": ""
  },{
    "IP": "ff01::1",
    "Zone": ""
  }, {
    "IP": "ff02::2:ff4d:9ef2",
    "Zone": ""
  }, {
    "IP": "ff02::1",
    "Zone": ""
  }, {
    "IP": "ff02::1:ff9e:2248",
    "Zone": ""
  }]

6、网络终端

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>