Go net 包的使用

2023-12-31 23:49:00 浏览数 (1)

net 包中定义了以下基本接口

代码语言:go复制
type Conn interface {
    Read(b []byte) (n int, err error)
    Write(b []byte) (n int, err error)
    Close() error
    LocalAddr() Addr
    RemoteAddr() Addr
    SetDeadline(t time.Time) error
    SetReadDeadline(t time.Time) error
    SetWriteDeadline(t time.Time) error
}

type PacketConn interface {
    ReadFrom(b []byte) (n int, addr Addr, err error)
    WriteTo(b []byte, addr Addr) (n int, err error)
    Close() error
    LocalAddr() Addr
    SetDeadline(t time.Time) error
    SetReadDeadline(t time.Time) error
    SetWriteDeadline(t time.Time) error
}

IP

主要类型

net.IP

用 string 创建 net.IP 对象,它实际是一个 []byte 类型

代码语言:go复制
ip := net.ParseIP("127.0.0.1")
net.IPAddr

创建 net.IPAddr 对象,是 net 包中许多函数和方法的操作对象

代码语言:go复制
ipAddr := net.IPAddr{
    IP: ip,
}
net.IPMask

可以用 4 个 bytes 创建一个 IPv4 的掩码

代码语言:go复制
ipmask := net.IPv4Mask(255, 255, 0, 0)
net.IPNet

net.IPNet 网段由 IP 和 IPMask 组成

代码语言:go复制
mask := net.IPv4Mask(byte(255), byte(255), byte(255), byte(0))
ip := net.ParseIP("192.168.1.125").Mask(mask)
in := &net.IPNet{ip, mask}
fmt.Println(in)         //  192.168.1.0/24

连接

代码语言:go复制
// 连接
func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error)   

// example
remoteAddr := net.IPAddr{
    IP: net.ParseIP("1.2.3.4"),
}
conn, err := net.DialIP("ip4:icmp", nil, &remoteAddr)

// 监听
func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error)
// example
localAddr := net.IPAddr{
    IP: net.ParseIP("127.0.0.1"),
}
net.ListenIP("ip4:icmp", &localAddr)

TCP

解析 TCP Address

代码语言:go复制
// net.TCPAddr 由 IP 和 Port 组成
// 解析 TCPAddr
addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8899")

连接

代码语言:go复制
func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)
func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)

控制 TCP 连接

代码语言:go复制
// 设置超时时间
func (c *TCPConn) SetTimeout(nsec int64) os.Error

// 设置客户端是否和服务器端一直保持着连接,即使没有任何的数据发送
func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error

常用函数

对于 IP、TCP、UDP、socket 等协议,封装了下列函数返回对应协议的连接

代码语言:go复制
func ListenPacket(net, laddr string) (PacketConn, error) 
func Listen(net, laddr string) (Listener, error)
func Dial(network, address string) (Conn, error)

Client/Server

基本 Socket 编程

Server:

代码语言:go复制
func connHandler(c net.Conn) {
    for {
        cnt, err := c.Read(buf)
        c.Write(buf)
    }
}

func main() {
    server, err := net.Listen("tcp", ":1208")
    for {
        conn, err := server.Accept()
        go connHandler(conn)
    }
}

Client:

代码语言:go复制
func connHandler(c net.Conn) {
    for {
        c.Write(...)
        c.Read(...)
    }
}

func main() {
    conn, err := net.Dial("tcp", "localhost:1208")
    connHandler(conn)
}
go

0 人点赞