企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
实际上,在前面《[Dial()函数](http://c.biancheng.net/view/4514.html)》一节中介绍的 Dial() 函数其实是对 DialTCP()、DialUDP()、DialIP() 和 DialUnix() 的封装。我们也可以直接调用这些函数,它们的功能是一致的。这些函数的原型如下: func DialTCP(net string, laddr, raddr \*TCPAddr) (c \*TCPConn, err error) func DialUDP(net string, laddr, raddr \*UDPAddr) (c \*UDPConn, err error) func DialIP(netProto string, laddr, raddr \*IPAddr) (\*IPConn, error) func DialUnix(net string, laddr, raddr \*UnixAddr) (c \*UnixConn, err error) 之前基于 TCP 发送的 HTTP 请求,读取服务器信息并返回 HTTP Head 的示例程序也可以使用下面的方式实现: ~~~ package mainimport ( "net" "os" "fmt" "io/ioutil")func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0]) os.Exit(1) } service := os.Args[1] tcpAddr, err := net.ResolveTCPAddr("tcp4", service) checkError(err) conn, err := net.DialTCP("tcp", nil, tcpAddr) checkError(err) _, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n")) checkError(err) result, err := ioutil.ReadAll(conn) checkError(err) fmt.Println(string(result)) os.Exit(0)}func checkError(err error) { if err != nil { fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error()) os.Exit(1) }} ~~~ 与之前使用 Dail() 的例子相比,有两个不同点: * net.ResolveTCPAddr() 用于解析地址和端口号; * net.DialTCP() 用于建立链接。 提示:这两个函数在 Dial() 函数中都得到了封装。 运行结果如下: go run main.go baidu.com:80 HTTP/1.1 200 OK Date: Fri, 03 Jan 2020 01:17:50 GMT Server: Apache Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT ETag: "51-47cf7e6ee8400" Accept-Ranges: bytes Content-Length: 81 Cache-Control: max-age=86400 Expires: Sat, 04 Jan 2020 01:17:50 GMT Connection: Close Content-Type: text/html 此外,net 包中还包含了一系列的工具函数,合理地使用这些函数可以更好地保障程序的质量。 验证 IP 地址有效性的函数如下: func net.ParseIP() 创建子网掩码的函数如下: func IPv4Mask(a, b, c, d byte) IPMask 获取默认子网掩码的函数如下: func (ip IP) DefaultMask() IPMask 根据域名查找 IP 的函数如下: func ResolveIPAddr(net, addr string) (\*IPAddr, error) func LookupHost(name string) (cname string, addrs \[\]string, err error)