Go version
go version go1.24.4 linux/amd64
Output of go env
in your module/workspace:
AR='ar'
CC='gcc'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_ENABLED='1'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
CXX='g++'
GCCGO='gccgo'
GO111MODULE=''
GOAMD64='v1'
GOARCH='amd64'
GOAUTH='netrc'
GOBIN=''
GOCACHE='/home/fuhz/.cache/go-build'
GOCACHEPROG=''
GODEBUG=''
GOENV='/home/fuhz/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFIPS140='off'
GOFLAGS=''
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build1848721630=/tmp/go-build -gno-record-gcc-switches'
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMOD='/home/fuhz/src/udpserver/go.mod'
GOMODCACHE='/home/fuhz/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/fuhz/go'
GOPRIVATE=''
GOPROXY='https://goproxy.cn,direct'
GOROOT='/opt/go'
GOSUMDB='sum.golang.org'
GOTELEMETRY='local'
GOTELEMETRYDIR='/home/fuhz/.config/go/telemetry'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/opt/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.24.4'
GOWORK=''
PKG_CONFIG='pkg-config'
What did you do?
I write a udp server to register clients incoming, and send list of clients.
my server main code:
addr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf(":%v", flag.Arg(0)))
if err != nil {
panic(err)
}
var buffer [1024]byte
var store = list.New()
store.Init()
c, err := net.ListenUDP("udp4", addr)
if err != nil {
panic(err)
}
defer c.Close()
for {
log.Println("listen udp:", c.LocalAddr().String())
c.SetDeadline(time.Now().Add(time.Second * 30))
n, raddr, err := c.ReadFrom(buffer[:])
if n == 0 || err != nil {
break
}
if !contains(store, raddr.String()) {
store.PushBack(raddr.String())
}
log.Println(string(buffer[:n]), raddr.String())
c.WriteTo([]byte("from="+c.LocalAddr().String()), raddr)
if string(buffer[:n]) == "list" {
res := []string{}
p := store.Front()
for {
if p == nil {
break
}
res = append(res, p.Value.(string))
p = p.Next()
}
data := strings.Join(res, ";")
c.WriteTo([]byte("list="+data), raddr)
log.Println("list")
}
}
my client main code:
conn, err := net.DialUDP("udp", nil, uaddr)
if err != nil {
return err
}
once.Do(func() {
go udpLoop(c)
})
n, err := conn.Write([]byte(msg))
if err != nil {
return err
}
if n == 0 {
return errors.New("send null")
}
return nil
}
func udpLoop(c *net.UDPConn) {
var buffer [1024]byte
for {
n, raddr, err := c.ReadFromUDP(buffer[:])
if n == 0 || err != nil {
break
}
fmt.Printf("%v:%v", string(buffer[:n]), raddr.String())
}
}
What did you see happen?
The server only reply the first client. The message from second client can not be received.
Seriously, after the second client send the message, the server seems to work full speed and blocked, the cpu work 100%, and the deadline time is not work.
What did you expect to see?
The server should reply every client incoming. The CPU load should be very low.
Comment From: gabyhelp
Related Issues
- net: DialUDP unexpected behavior when laddr not nil #29451 (closed)
- net: udp packets not load balanced by kubernetes service #31427 (closed)
- net: ReadFromUDP falls into busy waiting on empty UDP packet #59704 (closed)
- net: conn.WriteToUDP([]byte("not ok"), addr) #34758 (closed)
- Abnormal!! send udp on Windows #46194 (closed)
- net: udp listener should use received ip address for sending #36421
- net: mass tcp dial timeout with the concurrency more than 10000 #32761
- net: sending UDP datagrams back and forth fails with "sendmsg: operation not permitted" #63322
Related Discussions
(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)
Comment From: seankhliao
Unlike many projects, the Go project does not use GitHub Issues for general discussion or asking questions. GitHub Issues are used for tracking bugs and proposals only.
For questions please refer to https://github.com/golang/go/wiki/Questions