【发布时间】:2018-01-08 15:39:51
【问题描述】:
我在 Windows XP SP3 上使用 go1.9.2 windows/386 时遇到了一个严重问题。
Accept() 永远阻塞,即使我使用 SetDeadline() 设置了超时,直到程序退出。
我认为这很关键,因为我无法在需要时阻止听众。此外,conn.Read() 也永远阻塞,但我没有将它包含在示例中以使更简单。
package main
import (
"fmt"
"net"
"time"
)
func main() {
listener, err := net.Listen("tcp", ":8888")
if err != nil {
fmt.Println(err.Error())
return
}
tcplistener := listener.(*net.TCPListener)
tcplistener.SetDeadline(time.Now().Add(time.Second * 2))
fmt.Println("Listener started")
go func() {
defer func() {
tcplistener.Close()
fmt.Println("Listener closed")
}()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println(err.Error())
return
}
conn.Write([]byte("OK\n"))
conn.Close()
}
}()
time.Sleep(time.Second * 10)
fmt.Println("Exit")
}
终端输出:
Listener started
Exit
相比之下,当我在 VirtualBox 下的 Windows 7 上运行此程序时(在相同的 Windows XP SP3 上),Accept() 在超时后成功解除阻塞。
终端输出:
Listener started
accept tcp [::]:8888 i/o timeout
Listener closed
Exit
【问题讨论】:
-
如果 Windows XP SP3 仍然是受支持的平台(我还没有检查过),那么我会打开一个问题而不是在这里询问。
-
@JimB 根据 Go 网站,Windows XP SP 2 是受支持的最低 Windows 版本。 golang.org/doc/install#requirements
-
@JimB 好的,我已经打开了一个问题:github.com/golang/go/issues/23375
-
刚刚尝试在以前的稳定版本(go1.8.5 windows/386)上编译它。问题是一样的。
标签: go windows-xp blocking i386