net 包提供了可移植的网络i/o接口,包括TCP/IP、UDP、域名解析和Unix域socket
iPv4 和 ipv6
const (
IPv4len = 4
IPv6len = 16
)
ipv4 长度4个字节,ipv6长度16个字节
IPv4(255, 255, 255, 255)
ipv6 IP{0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}
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) // 本地网络,只能作为本地源地址其才是合法的
)
ipv6 常用的地址
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}
)
本节讲解内容如下
- 网路地址分割与拼接
- 格式化mac地址
- 获取当前系统网络接口的地址列表
- 获取系统网络的接口列表
- 查看主机ip相关信息
- 查看域名解析记录
- 监听网络接口
- 使用会话与服务器建立连接
网路地址分割与拼接
func SplitHostPort(hostport string) (host, port string, err error)
func JoinHostPort(host, port string) string
package main
import (
"net"
"fmt"
)
func main() {
host,port,_:= net.SplitHostPort("192.168.110.66:8080")
fmt.Println("host:",host,"port:",port)
fmt.Println("拼接",net.JoinHostPort(host,port))
}
net.SplitHostPort
的参数如能包含 http(s)://
否则解析不出来
格式化mac地址
package main
import (
"net"
"fmt"
)
func main() {
hw,error := net.ParseMAC("0123.4567.89ab.cdef.0000.0123.4567.89ab.cdef.0000")
if error != nil {
fmt.Println(error)
}
fmt.Println(hw.String())
}
获取当前系统网络接口的地址列表
func InterfaceAddrs() ([]Addr, error)
package main
import (
"net"
"fmt"
)
func main() {
addrs,_ := net.InterfaceAddrs()
for _,addr := range addrs {
fmt.Println(addr.String())
fmt.Println(addr.Network())
}
}
获取系统网络的接口列表
package main
import (
"net"
"fmt"
)
func main() {
interfaces,_ := net.Interfaces()
for _,addr := range interfaces {
fmt.Println(addr.Name) // 物理网卡设备名
fmt.Println(addr.Index) //索引
fmt.Println(addr.HardwareAddr)// mac地址
fmt.Println(addr.Flags)
fmt.Println(addr.MTU)// 组大传输数据
fmt.Println(addr.MulticastAddrs()) // 组播地址列表
}
}
查看主机ip相关信息
func LookupHost(host string) (addrs []string, err error)
func LookupIP(host string) ([]IP, error)
package main
import (
"net"
"fmt"
)
func main() {
// 查找地址映射列表
lt,_ := net.LookupHost("127.0.0.1")
for _,value := range lt {
fmt.Println(value)
}
//查找规范的dns主机名字
cname,_ := net.LookupCNAME("www.baidu.com")
fmt.Println(cname)
// 查找域名对应的主机名称
lt,_ = net.LookupHost("www.baidu.com")
for _,value := range lt {
fmt.Println(value)
}
// 查找域名对应的ip地址
ip, _ := net.LookupIP("www.baidu.com")
fmt.Println(ip)
}
查看域名解析记录
A 记录: 把域名解析到某一个指定的ip
CNAME:用子域名代替ip地址
MX 指向一个邮件服务器
NS 记录,解析服务器记录,用来表示那台服务器对该域名进行解析
TXT 为某一个主机名设置联系人信息
SRV 一般是为Microsoft的活动目录设置时的应用
package main
import (
"net"
"fmt"
)
func main() {
// 查找地址映射列表
//主机名的dns 的mx 记录 邮件服务器地址
mx,error:=net.LookupMX("baidu.com")
fmt.Println(error)
for _,value := range mx {
fmt.Println(value.Host)
}
//主机名的dns 的ns 记录 解析该域名的服务器地址
ns,error := net.LookupNS("mingbozhu.com")
fmt.Println(error)
fmt.Println(ns[0].Host)
// 联系人信息
txt,error := net.LookupTXT("mingbozhu.com")
fmt.Println(error)
fmt.Println(txt)
}
监听网络接口
package main
import (
"net"
"fmt"
)
func main() {
if ln, err := net.Listen("tcp", ":8081"); err == nil {
defer ln.Close()
for{
ln.Accept()
fmt.Println("Receive a Message")
}
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
r := bufio.NewReader(conn)
for {
msg, err := r.ReadString('\n')
if err != nil {
log.Println(err)
return
}
println(msg)
n, err := conn.Write([]byte("jude\n"))
if err != nil {
log.Println(n, err)
return
}
}
}
使用会话与服务器建立连接
func Dial(network, address string) (Conn, error)
package main
import (
"net"
"fmt"
"bufio"
)
func main() {
// 建立连接
conn, err := net.Dial("tcp", "www.mingbozhu.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')
fmt.Println(status)
fmt.Println(err)
}
网络类型分类
- tcp
- tcp4 (IPv4-only),
- tcp6 (IPv6-only)
- udp
- udp4 (IPv4-only)
- udp6 (IPv6-only)
- ip
- ip4(IPv4-only),
- ip6 (IPv6-only)
- unix
- unixgram
- unixpacket
对于TCP和 UDP 格式地址为 host:port
host 是ip地址或者域名
port 是数字或者服务名称
如果主机地址是ipv6,则格式为[2001:db8::1]:80 或者 [fe80::1%zone]:80
示例如下
Dial("tcp", "golang.org:http")
Dial("tcp", "192.0.2.1:http")
Dial("tcp", "198.51.100.1:80")
Dial("udp", "[2001:db8::1]:domain")
Dial("udp", "[fe80::1%lo0]:53")
Dial("tcp", ":80")
对IP网络,network必须是"ip"、"ip4"、"ip6"后跟冒号和协议号或者协议名,地址必须是IP地址字面值
Dial("ip4:1", "192.0.2.1")
Dial("ip6:ipv6-icmp", "2001:db8::1")
Dial("ip6:58", "fe80::1%lo0")
对于 TCP, UDP and IP ,如果主机为空,则ip使用:80
、0.0.0.0:80
、[::]:80
、udp和tcp使用 0.0.0.0
和 ::
对Unix网络,地址必须是文件系统路径