【问题标题】:How can I check if reading from a tcp socket will block?如何检查从 tcp 套接字读取是否会阻塞?
【发布时间】:2019-02-06 18:14:32
【问题描述】:

如果我有tcp连接conn,如何判断conn.Read是否会阻塞?

我的理解是 Go 的 Read 使用非阻塞套接字,只有在没有数据可供读取时才会阻塞(参见 https://stackoverflow.com/a/36117724/4447365)。

但是有什么方法可以检查套接字是否没有可用数据?

这可以通过使用 POSIX read function 来完成,方法是使用为零的 count 参数调用它。

【问题讨论】:

  • 您想要检查的事实意味着您可能存在设计缺陷,这很可能是 XY 问题。您能否详细说明您认为需要执行此类检查的目标?
  • 对您正在从事的工作的背景一无所知正是问题所在,这也是为什么我要求您提供有关您实际尝试完成的工作的更多详细信息。
  • @rnickb:在 Go 中编写时,您没有使用 POSIX。它在 Windows(大部分)中的工作方式相同。使用 Go 时,写 Go。
  • 嗯...'你可能有设计缺陷'-不是你确实有设计缺陷'。请注意,您评论调情时违反了 SO CoC。

标签: sockets go tcp


【解决方案1】:

在 Go 中编程时不要担心。假设一切都会阻塞。然后把它放在一个 goroutine 中,让它异步运行。

Go 运行时处理所有细节。

另外,the issue here 似乎是您想要做的。这个问题被拒绝了:Go 不会那样做。 C 也没有。即使它做到了,它也不可靠。如果您仔细阅读到最后,建议的解决方案涉及 Linger TCP 设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多