在Windows XP SP3上使用go1.9.2 windows / 386时,我遇到了一个严重的问题。
即使我使用SetDeadline()设置超时,Accept()也会永久阻止,直到程序退出。
我认为这很关键,因为我无法在需要时停止听众。另外,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 XP SP3上)时,Accept()会在超时后成功解锁。
终端输出:
Listener started
accept tcp [::]:8888 i/o timeout
Listener closed
Exit
答案 0 :(得分:0)
我找到了解决方案:重新安装 Windows XP SP3。
我尝试检查该应用在其他Windows XP SP3和Windows XP SP2安装上的工作原理,发现没有问题。
显然,这意味着我的XP以不同的方式工作。不幸的是,我不知道出了什么问题。