mirror of https://github.com/q191201771/lal.git
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.
67 lines
1.4 KiB
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
|
|
}
|