Networking 为什么net.Dial在连接被接受之前不阻塞?

Networking 为什么net.Dial在连接被接受之前不阻塞?,networking,go,Networking,Go,为什么在连接被接受之前拨号不阻塞?或者是否有任何方法可以检测到连接未被接受,从而避免耗尽服务器资源?如果我试图读取连接,我将永远被阻止(因为连接未被接受),当服务器决定接受我的连接时,我可能失去与服务器连接/拨号的机会。如果我启动新的go例程来读取拨号返回的每个连接,服务器就会耗尽(即,它无法每秒处理数千个go例程) //我需要拨号阻止呼叫的原因: 我正在尝试实现一个反向socks服务器: NAT后面的服务器x连接到->服务器y internet 来自internet的客户端z连接到->服务器y

为什么在连接被接受之前拨号不阻塞?或者是否有任何方法可以检测到连接未被接受,从而避免耗尽服务器资源?如果我试图读取连接,我将永远被阻止(因为连接未被接受),当服务器决定接受我的连接时,我可能失去与服务器连接/拨号的机会。如果我启动新的go例程来读取拨号返回的每个连接,服务器就会耗尽(即,它无法每秒处理数千个go例程)

//我需要拨号阻止呼叫的原因:

我正在尝试实现一个反向socks服务器:

NAT后面的服务器x
连接到->
服务器y internet

来自internet的客户端z
连接到->服务器y


因此,问题是NAT背后的服务器获得了大量连接(由于非阻塞拨号),即使
服务器y
不接受任何连接

您需要阅读有关TCP待办事项队列的信息。在服务器调用
accept()
之前,连接可以成功。它被放置在待办事项队列中。您想要的行为是不可实现的。实际上,我最终使用了一个不同的/专用的连接来管理连接池。谢谢你的帮助!
package main

import (
    "log"
    "net"
    "time"
)

func main() {
    go listen()
    // wait the listener
    time.Sleep(1)
    dial()
}
func listen() {
    dstNet := &net.TCPAddr{IP: net.ParseIP("0.0.0.0"), Port: 9090}
    // Listen on the dstNet
    _, err := net.ListenTCP("tcp", dstNet)
    if err != nil {
        panic(err)
    }
    time.Sleep(30 * time.Second)
}
func dial() {
    dstNet := &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 9090}
    for {
        log.Printf("dialing")
        conn, err := net.DialTCP("tcp", nil, dstNet)
        if err != nil {
            panic(err)
            //return
        }
        log.Printf("new conn %v", conn)
    }
}