我编写了一个简单的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:信号量超时时间已过期。”?这个错误是什么意思?
答案 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中执行此操作,则必须进行版本检查并自行调用。