Windows XP SP3上的Accept()超时设置

时间:2018-01-08 15:39:51

标签: go windows-xp blocking i386

在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

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:重新安装 Windows XP SP3。

我尝试检查该应用在其他Windows XP SP3和Windows XP SP2安装上的工作原理,发现没有问题。

显然,这意味着我的XP以不同的方式工作。不幸的是,我不知道出了什么问题。

相关问题