code: func ListenMulticastIPv4(gaddr, laddr net.IP) (*net.IPConn, error) {
  	gaddr = gaddr.To4()
  	laddr = laddr.To4()
  	c, err := net.ListenIP("ip4:112", &net.IPAddr{IP: gaddr})
  	if err != nil {
  		return nil, err
  	}
  
  	f, err := c.File()
  	if err != nil {
  		return nil, err
  	}
  	defer f.Close()
  
  	mreq := &syscall.IPMreq{
  		Multiaddr: [4]byte{gaddr[0], gaddr[1], gaddr[2], gaddr[3]},
  		Interface: [4]byte{laddr[0], laddr[1], laddr[2], laddr[3]},
  	}
  
  	err = syscall.SetsockoptIPMreq(int(f.Fd()), syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq)
  	if err != nil {
  		return nil, err
  	}
  
  	return c, nil
  }
docs: // ListenMulticastIPv4 creates a net.IPConn to receive multicast messages for the given group
  // address. laddr specifies which network interface to use when joining the group.