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 以不同的方式工作。不幸的是,我不知道哪里出了问题。