package turn
import (
"fmt"
"net"
"github.com/pion/randutil"
"github.com/pion/transport/v3"
"github.com/pion/transport/v3/stdnet"
)
type RelayAddressGeneratorPortRange struct {
RelayAddress net .IP
MinPort uint16
MaxPort uint16
MaxRetries int
Rand randutil .MathRandomGenerator
Address string
Net transport .Net
}
func (r *RelayAddressGeneratorPortRange ) Validate () error {
if r .Net == nil {
var err error
r .Net , err = stdnet .NewNet ()
if err != nil {
return fmt .Errorf ("failed to create network: %w" , err )
}
}
if r .Rand == nil {
r .Rand = randutil .NewMathRandomGenerator ()
}
if r .MaxRetries == 0 {
r .MaxRetries = 10
}
switch {
case r .MinPort == 0 :
return errMinPortNotZero
case r .MaxPort == 0 :
return errMaxPortNotZero
case r .RelayAddress == nil :
return errRelayAddressInvalid
case r .Address == "" :
return errListeningAddressInvalid
default :
return nil
}
}
func (r *RelayAddressGeneratorPortRange ) AllocatePacketConn (
network string ,
requestedPort int ,
) (net .PacketConn , net .Addr , error ) {
if requestedPort != 0 {
conn , err := r .Net .ListenPacket (network , fmt .Sprintf ("%s:%d" , r .Address , requestedPort ))
if err != nil {
return nil , nil , err
}
relayAddr , ok := conn .LocalAddr ().(*net .UDPAddr )
if !ok {
return nil , nil , errNilConn
}
relayAddr .IP = r .RelayAddress
return conn , relayAddr , nil
}
for try := 0 ; try < r .MaxRetries ; try ++ {
port := r .MinPort + uint16 (r .Rand .Intn (int ((r .MaxPort +1 )-r .MinPort )))
conn , err := r .Net .ListenPacket (network , fmt .Sprintf ("%s:%d" , r .Address , port ))
if err != nil {
continue
}
relayAddr , ok := conn .LocalAddr ().(*net .UDPAddr )
if !ok {
return nil , nil , errNilConn
}
relayAddr .IP = r .RelayAddress
return conn , relayAddr , nil
}
return nil , nil , errMaxRetriesExceeded
}
func (r *RelayAddressGeneratorPortRange ) AllocateConn (string , int ) (net .Conn , net .Addr , error ) {
return nil , nil , errTODO
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .