【问题标题】:Accept() timeout setting on Windows XP SP3Windows XP SP3 上的 Accept() 超时设置
【发布时间】: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


【解决方案1】:

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

我已尝试检查该应用在 Windows XP SP3 和 Windows XP SP2 的另一个安装中的运行情况,发现没有问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2010-10-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多