Socket 编程
Go 对 C 的套接字系统调用进行了一些封装,使 API 更少,更易用
TCP 编程
socket,bind,和 listen 被合并成 -> net.Listen(“tcp”, “:8080”) 返回一个 net.TCPListener,第二个参数如果不加上 IP 的话就是绑定任意IP(默认匹配所有)
监听器的接口隔离了底层的实现
type Listener interface {
Accept() (conn, error)
Close() error
Addr() Addr
}
同样每次 accept 一个conn也使用了接口进行抽象
type Conn interface {
Read(b []byte) (n int, err error)
Write(b []byte) (n int, err error)
Close() error
}
对于每一个 conn 还可以设置超时时间
conn.SetDeadline(t time.Time) // 设定当前连接IO操作(包括但不限于读和写)的超时时间,仅针对当前连接!!
conn.SetReadDeadline(t time.Time)
conn.SetWriteDeadline(t time.Time)
// 值得注意的是,即使一个写操作超时了,也不一定表示写操作完全没有成功,因此write的第一个返回值也就是写入的字节数也可能大于0
UDP编程
net.ListenPacket(“udp”, “:8080”)
net.PacketConn 可以调用 ReadFrom 得到数据 也可以被 WriteTo
端口冲突
如果多个 socket 被绑定到同一个端口下,会出现端口冲突 解决方案: SOCKET 选项定制套接字的行为 设置 SO_REUSEADDR 选项可以让相同的协议绑定相同的端口 系统会根据绑定的 IP 来进行分配
socket 选项可以在 ListenConfig 结构体中进行定义并传入 listener 中 通过 rawConn.Control 的回调来定制 socket 选项 不同操作系统设置选项的实现会有所不同,因此需要使用 unix.SetsockoptInt