net: platform-dependent default socket options

This CL revises existing platform-dependent default socket
options to make it possible to accomodate multiple multicast
datagram listeners on a single service port.

Also removes unnecessary SO_REUSEADDR, SO_REUSEPORT socket
options from unicast datagram sockets by default.

Fixes #1692.

R=devon.odell, alex.brainman, rsc
CC=golang-dev
https://golang.org/cl/5538052
diff --git a/src/pkg/net/multicast_test.go b/src/pkg/net/multicast_test.go
index 96bac45..183d5a8 100644
--- a/src/pkg/net/multicast_test.go
+++ b/src/pkg/net/multicast_test.go
@@ -95,6 +95,49 @@
 	}
 }
 
+func TestSimpleMulticastUDP(t *testing.T) {
+	if runtime.GOOS == "plan9" {
+		return
+	}
+	if !*multicast {
+		t.Logf("test disabled; use --multicast to enable")
+		return
+	}
+
+	for _, tt := range multicastUDPTests {
+		var ifi *Interface
+		if tt.ipv6 {
+			continue
+		}
+		tt.flags = FlagUp | FlagMulticast
+		ift, err := Interfaces()
+		if err != nil {
+			t.Fatalf("Interfaces failed: %v", err)
+		}
+		for _, x := range ift {
+			if x.Flags&tt.flags == tt.flags {
+				ifi = &x
+				break
+			}
+		}
+		if ifi == nil {
+			t.Logf("an appropriate multicast interface not found")
+			return
+		}
+		c, err := ListenUDP(tt.net, &UDPAddr{IP: tt.laddr})
+		if err != nil {
+			t.Fatalf("ListenUDP failed: %v", err)
+		}
+		defer c.Close()
+		if err := c.JoinGroup(ifi, tt.gaddr); err != nil {
+			t.Fatalf("JoinGroup failed: %v", err)
+		}
+		if err := c.LeaveGroup(ifi, tt.gaddr); err != nil {
+			t.Fatalf("LeaveGroup failed: %v", err)
+		}
+	}
+}
+
 func testIPv4MulticastSocketOptions(t *testing.T, fd *netFD, ifi *Interface) {
 	ifmc, err := ipv4MulticastInterface(fd)
 	if err != nil {