编写了一个 TCP 客户端,用于创建 10 个 TCP 并发连接(保持记录器时间)并仅启用 10 个临时端口(49001 - 49010 ip_local_port_range 文件)。
func createConnection(c int, desAddr, desPort string) (brokerCon net.Conn, err error) {
localips := GetLocalIP()
maxRetry := len(localips)
retry := 0
for retry < maxRetry {
lIPPort := fmt.Sprintf("%s:0", strings.Split(localips[retry].String(), "/")[0])
fmt.Println("\n---", lIPPort)
laddr, lerr := net.ResolveTCPAddr("tcp4", lIPPort)
if lerr != nil {
fmt.Println("Getting Error ResolveTCPAddr for local ", lerr)
}
raddr, rerr := net.ResolveTCPAddr("tcp4", desAddr+desPort)
if rerr != nil {
fmt.Println("Getting Error ResolveTCPAddr for local ", rerr)
}
brokerCon, err = net.DialTCP("tcp", laddr, raddr)
if err != nil {
fmt.Printf("Failed to connect connetion %d , %d retrying with seconday IP, err:\n",
c, retry, err)
retry = retry + 1
time.Sleep(1 * time.Second)
continue
} else {
//fmt.Println("successfull ")
break
}
}
return
}
场景 1:
如果 DialTCP 方法上的梯形图值为 nil,则可以创建 10 个连接。 DialTCP 能够使用 49009 和 49007 端口,这些端口已经被一些不同的目的地使用(因为 TCP 连接是由 5 元组决定的:[本地 IP、本地端口、远程 IP、远程端口、协议]< /strong> ).
sudo netstat -anpl --tcp --udp | grep 490
tcp 0 0 10.50.1.245:49005 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49010 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49008 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49009 XXX.XXX.XXX.X44:443 ESTABLISHED 3250/XXXX
tcp 0 0 10.50.1.245:49006 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49002 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49004 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49001 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49007 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49003 10.50.1.41:9999 ESTABLISHED 23408/client
tcp 0 0 10.50.1.245:49007 XXX.XXX.XXX.X29:443 ESTABLISHED 2806/XXXX
tcp 0 0 10.50.1.245:49009 10.50.1.41:9999 ESTABLISHED 23408/client
场景 2:
如果我使用 0 端口传递本地 IP 详细信息(10.50.1.245),它只能创建 8 个连接,并为剩余的 2 个连接抛出 bind: address already in use。如果本地地址不是 nil 为什么 dialTCP 不能使用 49005 和 49007 端口,这些端口已经被一些不同的目的地使用了。
sudo netstat -anpl --tcp --udp | grep 490
tcp 0 0 10.50.1.245:49010 10.50.1.41:9999 ESTABLISHED 25841/client
tcp 0 0 10.50.1.245:49005 XXX.XXX.XXX.X66:443 ESTABLISHED 2510/XXX
tcp 0 0 10.50.1.245:49008 10.50.1.41:9999 ESTABLISHED 25841/client
tcp 0 0 10.50.1.245:49005 XXX.XXX.XXX.X44:443 ESTABLISHED 3250/XXX
tcp 0 0 10.50.1.245:49006 10.50.1.41:9999 ESTABLISHED 25841/client
tcp 0 0 10.50.1.245:49002 10.50.1.41:9999 ESTABLISHED 25841/client
tcp 0 0 10.50.1.245:49004 10.50.1.41:9999 ESTABLISHED 25841/client
tcp 0 0 10.50.1.245:49001 10.50.1.41:9999 ESTABLISHED 25841/client
tcp 0 0 10.50.1.245:49003 10.50.1.41:9999 ESTABLISHED 25841/client
tcp 0 0 10.50.1.245:49007 XXX.XXX.XXX.X29:443 ESTABLISHED 2806/XXX
tcp 0 0 10.50.1.245:49009 10.50.1.41:9999 ESTABLISHED 25841/client