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