一尘不染

如何读取UDP连接,直到达到超时?

go

我需要读取UDP流量,直到达到超时为止。我可以通过在UDPConn上调用SetDeadline并循环直到出现I /
O超时错误来做到这一点,但这似乎有些破绽(基于错误条件的流控制)。以下代码段似乎更正确,但不会终止。在生产中,这显然将在goroutine中执行;为了简单起见,它被编写为主要功能。

package main

import (
    "fmt"
    "time"
)

func main() {
    for {
        select {
        case <-time.After(time.Second * 1):
            fmt.Printf("Finished listening.\n")
            return
        default:
            fmt.Printf("Listening...\n")
            //read from UDPConn here
        }
    }
}

给定程序为什么不终止?基于https://gobyexample.com/selecthttps://gobyexample.com/timeoutshttps://gobyexample.com/non-
blocking-channel-operations,我希望上面的代码,选择默认的情况下,持续一秒钟,然后采取第一种情况并跳出循环。我如何修改上面的代码片段以达到所需的循环和读取效果,直到发生超时?


阅读 287

收藏
2020-07-02

共1个答案

一尘不染

只需从循环time.After外部分配通道for,否则每次循环时将只创建一个新计时器。

例:

func main() {
    ch := time.After(time.Second * 1)
L:
    for {
        select {
        case <-ch:
            fmt.Printf("Finished listening.\n")
            break L // have to use a label or it will just break select
        default:
            fmt.Printf("Listening...\n")
            //read from UDPConn here
        }
    }
}

请注意,这在操场上不起作用。

2020-07-02