net 包中定义了以下基本接口
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
类型
ip := net.ParseIP("127.0.0.1")
net.IPAddr
创建 net.IPAddr 对象,是 net 包中许多函数和方法的操作对象
ipAddr := net.IPAddr{
IP: ip,
}
net.IPMask
可以用 4 个 bytes 创建一个 IPv4 的掩码
ipmask := net.IPv4Mask(255, 255, 0, 0)
net.IPNet
net.IPNet 网段由 IP 和 IPMask 组成
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
连接
// 连接
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
// net.TCPAddr 由 IP 和 Port 组成
// 解析 TCPAddr
addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8899")
连接
func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error)
func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error)
控制 TCP 连接
// 设置超时时间
func (c *TCPConn) SetTimeout(nsec int64) os.Error
// 设置客户端是否和服务器端一直保持着连接,即使没有任何的数据发送
func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error
常用函数
对于 IP、TCP、UDP、socket 等协议,封装了下列函数返回对应协议的连接
func ListenPacket(net, laddr string) (PacketConn, error)
func Listen(net, laddr string) (Listener, error)
func Dial(network, address string) (Conn, error)
例如
conn, err := net.Dial("tcp", "127.0.0.1:80")
Client/Server
基本 Socket 编程
Server:
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:
func connHandler(c net.Conn) {
for {
c.Write(...)
c.Read(...)
}
}
func main() {
conn, err := net.Dial("tcp", "localhost:1208")
connHandler(conn)
}