func ListenRouter(multicastAddress string) (*RouterSocket, error) {
	return ListenRouterOnInterface(nil, multicastAddress)
}
ListenRouter creates a new Socket which can be used to exchange KNXnet/IP packets with
multiple endpoints.
package knxnet
import (
	"net"
	"time"
	"github.com/vapourismo/knx-go/knx/util"
)
type Socket interface {
	Send(payload ServicePackable) error
	Inbound() <-chan Service
	Close() error
	LocalAddr() (*net.UDPAddr, error)
}
type TunnelSocket struct {
	conn    *net.UDPConn
	inbound <-chan Service
}
func DialTunnel(address string) (*TunnelSocket, error) {
	addr, err := net.ResolveUDPAddr("udp4", address)
	if err != nil {
		return nil, err
	}
	conn, err := net.DialUDP("udp4", nil, addr)
	if err != nil {
		return nil, err
	}
	conn.SetDeadline(time.Time{})
	inbound := make(chan Service)
	go serveUDPSocket(conn, addr, inbound)
	return &TunnelSocket{conn, inbound}, nil
}
func (sock *TunnelSocket) Send(payload ServicePackable) error {
	buffer := make([]byte, Size(payload))
	Pack(buffer, payload)
	_, err := sock.conn.Write(buffer)
	return err
}
func (sock *TunnelSocket) Inbound() <-chan Service {
	return sock.inbound
}
func (sock *TunnelSocket) Close() error {
	return sock.conn.Close()
}
func (sock *TunnelSocket) LocalAddr() (localAddr *net.UDPAddr, err error) {
	localAddr, err = net.ResolveUDPAddr("udp4", sock.conn.LocalAddr().String())
	return
}
type RouterSocket struct {
	conn    *net.UDPConn
	addr    *net.UDPAddr
	inbound <-chan Service
}