Windows XP SP3 上的 Accept() 超时设置
Accept() timeout setting on Windows XP SP3
我在 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
相比之下,当我 运行 这个程序在 Windows 7 下的 VirtualBox 上(在同一个 Windows XP SP3 上)时,Accept() 在超时后成功解锁。
终端输出:
Listener started
accept tcp [::]:8888 i/o timeout
Listener closed
Exit
我找到了解决方案:重新安装 Windows XP SP3。
我尝试检查该应用程序在 Windows XP SP3 和 Windows XP SP2 的另一个安装上的运行情况,发现没有任何问题。
显然,这意味着我的 XP 以不同的方式工作。不幸的是,我不知道哪里出了问题。
我在 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
相比之下,当我 运行 这个程序在 Windows 7 下的 VirtualBox 上(在同一个 Windows XP SP3 上)时,Accept() 在超时后成功解锁。
终端输出:
Listener started
accept tcp [::]:8888 i/o timeout
Listener closed
Exit
我找到了解决方案:重新安装 Windows XP SP3。
我尝试检查该应用程序在 Windows XP SP3 和 Windows XP SP2 的另一个安装上的运行情况,发现没有任何问题。
显然,这意味着我的 XP 以不同的方式工作。不幸的是,我不知道哪里出了问题。