前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go net 包的使用

Go net 包的使用

原创
作者头像
dandelion1990
发布2023-12-31 23:49:00
1260
发布2023-12-31 23:49:00
举报

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)
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • IP
    • 主要类型
      • net.IP
      • net.IPAddr
      • net.IPMask
      • net.IPNet
    • 连接
    • TCP
    • 常用函数
    • Client/Server
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档