mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
This CL introduces new function ListenMulticastUDP to fix multicast UDP listening across multiple listeners issue, to replace old multicast methods JoinGroup and LeaveGroup on UDPConn. This CL also enables multicast testing by default. Fixes #2730. R=rsc, paul.a.lalonde, fullung, devon.odell CC=golang-dev https://golang.org/cl/5562048
49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
// Copyright 2011 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Socket options for Linux
|
|
|
|
package net
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
)
|
|
|
|
func setDefaultSockopts(s, f, t int) error {
|
|
switch f {
|
|
case syscall.AF_INET6:
|
|
// Allow both IP versions even if the OS default is otherwise.
|
|
// Note that some operating systems never admit this option.
|
|
syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, 0)
|
|
}
|
|
|
|
if f == syscall.AF_UNIX ||
|
|
(f == syscall.AF_INET || f == syscall.AF_INET6) && t == syscall.SOCK_STREAM {
|
|
// Allow reuse of recently-used addresses.
|
|
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
|
|
if err != nil {
|
|
return os.NewSyscallError("setsockopt", err)
|
|
}
|
|
|
|
}
|
|
|
|
// Allow broadcast.
|
|
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
|
|
if err != nil {
|
|
return os.NewSyscallError("setsockopt", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func setDefaultMulticastSockopts(s int) error {
|
|
// Allow multicast UDP and raw IP datagram sockets to listen
|
|
// concurrently across multiple listeners.
|
|
err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)
|
|
if err != nil {
|
|
return os.NewSyscallError("setsockopt", err)
|
|
}
|
|
return nil
|
|
}
|