2014-03-04 103 views
2

我写这在Windows和测试运行远程端口是否激活一个简单的围棋程序:“ConnectEx tcp:信号量超时期限已过期”是什么意思?

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:信号灯超时时间已过期。”?这个错误的含义是什么?

回答

1

net.Dial()的呼叫超时已过期。

如所见here,所述Dialer struct包含Timeout字段定义的时间,一个Dial()将等待一个连接完成的最大金额。

+0

为什么超时返回“信号量超时期限已过期”?我想形成你的解释,错误应该是“连接超时”,信号量是指什么? –

+0

[** semaphore **](http://en.wikipedia.org/wiki/Semaphore_%28programming%29)_在计算机科学中,特别是在操作系统中,信号量是一种变量或抽象数据类型,用于控制通过多个进程访问并行编程或多用户环境中的公共资源._听起来或许更进一步,下游有一个信号量用于控制网络上的并发访问,例如'net.Dial()',一个信号量总是实现一个超时。 – Vector

0

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

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

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