“ConnectEx tcp:信号量超时时间已过期”是什么意思。

时间:2014-03-04 05:26:57

标签: windows tcp go

我编写了一个简单的go程序,它在windows上运行并测试远程端口是否处于活动状态:

package main
import (
    "fmt"
    "net"
)

func main(){
    conn, err := net.Dial("tcp", "192.168.23.191:3403")
    if err != nil {
        fmt.Println(err)
    } else {
        conn.Close()
    }
}  

现在,远程端口已关闭。我第一次运行它,错误是:

dial tcp 192.168.23.191:3403: ConnectEx tcp: The remote computer refused the network connection.  

然后我继续运行它,错误更改为:

dial tcp 192.168.23.191:3403: ConnectEx tcp: The semaphore timeout period has expired.

为什么拨号返回“ConnectEx tcp:信号量超时时间已过期。”?这个错误是什么意思?

2 个答案:

答案 0 :(得分:1)

net.Dial()的调用超时已到期。

here所示,Dialer结构有一个Timeout字段,用于定义 Dial()等待连接完成的最长时间

答案 1 :(得分:0)

net.Dial(带有一些中间函数)ends up调用ConnectEx,这是BSD套接字的Windows特定扩展。
如果无法建立连接(Windows符合RFC 1122 Section 4.2.3.5并尝试multiple次),ConnectEx将失败并显示ERROR_SEM_TIMEOUT(AFAIK未正式记录,可能会出现类似{{1}的错误}})。

因此该错误意味着该端口已关闭。

在Windows 8和更新版本的Windows上,可以change the connections settings for a single socket,如果你想在Go中执行此操作,则必须进行版本检查并自行调用。