首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[教程]Go语言DialTCP():网络通信

发布于 2025-06-04 21:37:59
0
47

实际上,在前面《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() 中都得到了封装。

此外,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);

评论
一个月内的热帖推荐
宁儿
Lv.1来自QQ

452

帖子

22

小组

1735

积分

赞助商广告
站长交流