为什么拨号在接受连接之前不会阻止?或者有什么方法可以检测到连接未被接受,以便我可以避免耗尽我的服务器资源?如果我尝试读取连接,我会永远被阻止(因为连接未被接受),当我决定接受我的连接时,我可能会失去连接/拨打服务器的机会。如果我启动新的go例程来读取Dial返回的每个连接,服务器就会耗尽(即它不能每秒处理数千个例程)。
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)
}
}
//我需要拨打来阻止呼叫的原因:
我正在尝试实施反向服务器服务器:
server x behind NAT
连接到 - > server y internet
client z from internet
连接到 - >服务器y
所以问题是NAT后面的服务器获得了很多连接(由于非阻塞拨号),即使server y
没有接受任何连接。