为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 go 支持与 UDP 服务器的并发连接

如何使用 go 支持与 UDP 服务器的并发连接

Go
森栏 2021-09-13 16:03:58
我正在使用我的第一个基本 udp 服务器,我想知道如何支持并发连接?我认为用我的代码一次只能获得一个连接来处理它,用一个 tcp 简单的服务器,事情似乎比这种情况更清楚,抛出一个 goroutine 来处理数据,但在这里我很丢失了,提前致谢。func main() {    ListenerUDP("127.0.0.1", 1111)}func ListenerUDP(ip string, port int) {    buffer := make([]byte, 1024)    log.Println("Listener Started!")    addr := net.UDPAddr{        Port: port,        IP:   net.ParseIP(ip),    }    conn, err := net.ListenUDP("udp", &addr)    if err != nil {        log.Fatalf("Error Listening:%s\n", err.Error())        panic(err)    }    defer conn.Close()    for {        _, remoteAddr, err := conn.ReadFromUDP(buffer[0:])        if err != nil {            log.Fatalf("Error:%s\n", err)        }        // Process data here? using a > go something()?        fmt.Printf("Data:%s From:%v\n", buffer, remoteAddr)    }}
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

UDP是一种无连接协议——主机发送数据包而不先建立连接。


为了让多个内核并行处理 UDP 数据包,您可能会启动一堆 goroutines,每个 goroutines 执行ReadFromUDP循环:


package main


import (

        "fmt"

        "net"

        "runtime"

)


func listen(connection *net.UDPConn, quit chan struct{}) {

        buffer := make([]byte, 1024)

        n, remoteAddr, err := 0, new(net.UDPAddr), error(nil)

        for err == nil {

                n, remoteAddr, err = connection.ReadFromUDP(buffer)

                // you might copy out the contents of the packet here, to

                // `var r myapp.Request`, say, and `go handleRequest(r)` (or

                // send it down a channel) to free up the listening

                // goroutine. you do *need* to copy then, though,

                // because you've only made one buffer per listen().

                fmt.Println("from", remoteAddr, "-", buffer[:n])

        }

        fmt.Println("listener failed - ", err)

        quit <- struct{}{}

}


func main() {

        addr := net.UDPAddr{

                Port: 12345,

                IP:   net.IP{127, 0, 0, 1},

        }

        connection, err := net.ListenUDP("udp", &addr)

        if err != nil {

                panic(err)

        }

        quit := make(chan struct{})

        for i := 0; i < runtime.NumCPU(); i++ {

                go listen(connection, quit)

        }

        <-quit // hang until an error

}



查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信