为什么net.Dial在接受连接之前没有阻塞?

时间:2015-07-01 04:45:47

标签: networking go

为什么拨号在接受连接之前不会阻止?或者有什么方法可以检测到连接未被接受,以便我可以避免耗尽我的服务器资源?如果我尝试读取连接,我会永远被阻止(因为连接未被接受),当我决定接受我的连接时,我可能会失去连接/拨打服务器的机会。如果我启动新的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没有接受任何连接。

0 个答案:

没有答案