2023-04-07 19:30:05 +00:00
|
|
|
package sturn
|
2023-04-07 18:42:17 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
// "encoding/json"
|
|
|
|
"sync"
|
|
|
|
// "time"
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
)
|
|
|
|
|
|
|
|
var sturn *Sturn
|
2023-04-07 19:30:05 +00:00
|
|
|
const SturnKeepAlive = 3600
|
2023-04-07 18:42:17 +00:00
|
|
|
|
|
|
|
type SturnSession struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
type Sturn struct {
|
|
|
|
sync sync.Mutex
|
|
|
|
sessions []*SturnSession
|
|
|
|
port uint
|
|
|
|
relayStart uint
|
|
|
|
relayEnd uint
|
|
|
|
conn *net.PacketConn
|
|
|
|
closed chan bool
|
|
|
|
}
|
|
|
|
|
|
|
|
func Listen(port uint, relayStart uint, relayEnd uint) (error) {
|
|
|
|
|
|
|
|
if (sturn != nil) {
|
|
|
|
(*sturn.conn).Close()
|
|
|
|
<-sturn.closed
|
|
|
|
sturn = nil
|
|
|
|
}
|
|
|
|
|
|
|
|
address := fmt.Sprintf(":%d", port)
|
|
|
|
conn, err := net.ListenPacket("udp", address)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Println("STARTED STURN SERVER")
|
|
|
|
|
|
|
|
sturn := &Sturn{
|
|
|
|
port: port,
|
|
|
|
relayStart: relayStart,
|
|
|
|
relayEnd: relayEnd,
|
|
|
|
conn: &conn,
|
|
|
|
}
|
|
|
|
|
|
|
|
go sturn.serve(conn);
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func Close() {
|
|
|
|
if (sturn != nil) {
|
|
|
|
(*sturn.conn).Close()
|
|
|
|
<-sturn.closed
|
|
|
|
sturn = nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Sturn) serve(conn net.PacketConn) {
|
|
|
|
for {
|
|
|
|
buf := make([]byte, 1024)
|
|
|
|
n, addr, err := conn.ReadFrom(buf)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-04-07 19:30:05 +00:00
|
|
|
s.handleMessage(buf[:n], addr);
|
2023-04-07 18:42:17 +00:00
|
|
|
}
|
2023-04-07 19:30:05 +00:00
|
|
|
|
|
|
|
// TODO terminate all sessions
|
|
|
|
|
2023-04-07 18:42:17 +00:00
|
|
|
s.closed <- true
|
|
|
|
}
|
|
|
|
|