You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/alpha/stun/server.go

67 lines
1.4 KiB
Go

// Copyright 2020, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package stun
import (
"net"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/nazanet"
)
type Server struct {
conn *nazanet.UDPConnection
}
func NewServer(addr string) (*Server, error) {
conn, err := nazanet.NewUDPConnection(func(option *nazanet.UDPConnectionOption) {
option.LAddr = addr
})
if err != nil {
return nil, err
}
return &Server{
conn: conn,
}, nil
}
func (s *Server) RunLoop() (err error) {
return s.conn.RunLoop(s.onReadUDPPacket)
}
func (s *Server) Dispose() error {
return s.conn.Dispose()
}
func (s *Server) onReadUDPPacket(b []byte, raddr *net.UDPAddr, err error) bool {
if err != nil {
return false
}
h, err := UnpackHeader(b)
if err != nil {
nazalog.Errorf("parse header failed. err=%+v", err)
return false
}
if h.Typ != typeBindingRequestBE {
nazalog.Errorf("type invalid. type=%d", h.Typ)
return false
}
resp, err := PackBindingResponse(raddr.IP, raddr.Port)
if err != nil {
nazalog.Errorf("pack binding response failed. err=%+v", err)
return false
}
if err := s.conn.Write2Addr(resp, raddr); err != nil {
nazalog.Errorf("write failed. err=%+v", err)
return false
}
return true
}