Go语言中TCP/IP网络编程的深入讲解

2020-01-28 13:01:56于丽

    |                                             ^
    V                                             |
gob编码       ---------------------------->     gob解码
    |                                             ^
    V                                             |  
   发送     ============网络=================    接收

通过TCP发送字符串数据的基本要素

发送端上

发送字符串需要三个简单的步骤:

打开对应接收进程的连接。 写字符串。 关闭连接。

net包提供了一对实现这个功能的方法。

ResolveTCPAddr(): 该函数返回TCP终端地址。 DialTCP(): 类似于TCP网络的拨号。

这两个方法都是在go源码的src/net/tcpsock.go文件中定义的。


func ResolveTCPAddr(network, address string) (*TCPAddr, error) {
 switch network {
 case "tcp", "tcp4", "tcp6":
 case "": // a hint wildcard for Go 1.0 undocumented behavior
 network = "tcp"
 default:
 return nil, UnknownNetworkError(network)
 }
 addrs, err := DefaultResolver.internetAddrList(context.Background(), network, address)
 if err != nil {
 return nil, err
 }
 return addrs.forResolve(network, address).(*TCPAddr), nil
}

ResolveTCPAddr()接收两个字符串参数。

network: 必须是TCP网络名,比如tcp, tcp4, tcp6。 address: TCP地址字符串,如果它不是字面量的IP地址或者端口号不是字面量的端口号, ResolveTCPAddr会将传入的地址解决成TCP终端的地址。否则传入一对字面量IP地址和端口数字作为地址。address参数可以使用host名称,但是不推荐这样做,因为它最多会返回host名字的一个IP地址。

ResolveTCPAddr()接收的代表TCP地址的字符串(例如localhost:80, 127.0.0.1:80, 或[::1]:80, 都是代表本机的80端口), 返回(net.TCPAddr指针, nil)(如果字符串不能被解析成有效的TCP地址会返回(nil, error))。