• Go语言DialTCP():网络通信

    实际上,在前面《Dial()函数》一节中介绍的 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 main
    import (
        "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)

更多...

加载中...