package freeport
import (
"fmt"
"net"
)
func TCP() (int, error) {
lAddr0, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:0")
if err != nil {
return 0, err
}
l, err := net.ListenTCP("tcp4", lAddr0)
if err != nil {
return 0, err
}
defer l.Close()
lAddr := l.Addr()
lTCPAddr, ok := lAddr.(*net.TCPAddr)
if !ok {
return 0, fmt.Errorf("expected *net.TCPAddr, got %v", lAddr)
}
port := lTCPAddr.Port
if port <= 0 {
return 0, fmt.Errorf("unexpected port %d", port)
}
return port, nil
}
func UDP() (int, error) {
lAddr0, err := net.ResolveUDPAddr("udp4", "127.0.0.1:0")
if err != nil {
return 0, err
}
l, err := net.ListenUDP("udp4", lAddr0)
if err != nil {
return 0, err
}
defer l.Close()
lAddr := l.LocalAddr()
lUDPAddr, ok := lAddr.(*net.UDPAddr)
if !ok {
return 0, fmt.Errorf("expected *net.UDPAddr, got %v", lAddr)
}
port := lUDPAddr.Port
if port <= 0 {
return 0, fmt.Errorf("unexpected port %d", port)
}
return port, nil
}