在 net.DialTCP 中指定本地 IP 地址抛出错误绑定:地址已在使用中

时间:2021-06-21 15:16:00

标签: go tcp

编写了一个 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  

0 个答案:

没有答案