2020-07-21 11:18:47 +08:00
|
|
|
|
package nodes
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2020-07-22 22:18:47 +08:00
|
|
|
|
"context"
|
2020-07-21 11:18:47 +08:00
|
|
|
|
"errors"
|
2024-07-27 15:42:50 +08:00
|
|
|
|
"net"
|
|
|
|
|
|
"strings"
|
|
|
|
|
|
"sync"
|
|
|
|
|
|
|
2020-09-13 20:37:40 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
2020-10-28 11:19:06 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeNode/internal/events"
|
2020-12-17 17:36:10 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
|
2024-05-11 09:23:54 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeNode/internal/utils/goman"
|
2022-09-14 17:18:00 +08:00
|
|
|
|
"golang.org/x/net/ipv4"
|
|
|
|
|
|
"golang.org/x/net/ipv6"
|
2020-07-21 11:18:47 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type Listener struct {
|
2022-09-18 16:18:31 +08:00
|
|
|
|
group *serverconfigs.ServerAddressGroup
|
|
|
|
|
|
listener ListenerInterface // 监听器
|
2020-07-22 22:18:47 +08:00
|
|
|
|
|
2020-07-21 11:18:47 +08:00
|
|
|
|
locker sync.RWMutex
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func NewListener() *Listener {
|
|
|
|
|
|
return &Listener{}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-09-22 19:40:11 +08:00
|
|
|
|
func (this *Listener) Reload(group *serverconfigs.ServerAddressGroup) {
|
2020-07-21 11:18:47 +08:00
|
|
|
|
this.locker.Lock()
|
|
|
|
|
|
this.group = group
|
2020-09-27 18:41:56 +08:00
|
|
|
|
if this.listener != nil {
|
|
|
|
|
|
this.listener.Reload(group)
|
|
|
|
|
|
}
|
|
|
|
|
|
this.locker.Unlock()
|
2020-07-21 11:18:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (this *Listener) FullAddr() string {
|
|
|
|
|
|
if this.group != nil {
|
|
|
|
|
|
return this.group.FullAddr()
|
|
|
|
|
|
}
|
|
|
|
|
|
return ""
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (this *Listener) Listen() error {
|
|
|
|
|
|
if this.group == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
2022-07-05 20:37:00 +08:00
|
|
|
|
var protocol = this.group.Protocol()
|
2021-06-07 15:45:47 +08:00
|
|
|
|
if protocol.IsUDPFamily() {
|
|
|
|
|
|
return this.listenUDP()
|
|
|
|
|
|
}
|
|
|
|
|
|
return this.listenTCP()
|
|
|
|
|
|
}
|
2020-07-21 11:18:47 +08:00
|
|
|
|
|
2021-06-07 15:45:47 +08:00
|
|
|
|
func (this *Listener) listenTCP() error {
|
|
|
|
|
|
if this.group == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
2022-07-05 20:37:00 +08:00
|
|
|
|
var protocol = this.group.Protocol()
|
2021-06-07 15:45:47 +08:00
|
|
|
|
|
2021-12-18 19:17:40 +08:00
|
|
|
|
tcpListener, err := this.createTCPListener()
|
2020-07-22 22:18:47 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2021-12-22 16:43:16 +08:00
|
|
|
|
var netListener = NewClientListener(tcpListener, protocol.IsHTTPFamily() || protocol.IsHTTPSFamily())
|
2022-01-12 20:31:04 +08:00
|
|
|
|
events.OnKey(events.EventQuit, this, func() {
|
2020-12-17 17:36:10 +08:00
|
|
|
|
remotelogs.Println("LISTENER", "quit "+this.group.FullAddr())
|
2020-10-28 11:19:06 +08:00
|
|
|
|
_ = netListener.Close()
|
|
|
|
|
|
})
|
2020-07-22 22:18:47 +08:00
|
|
|
|
|
2020-09-09 18:53:53 +08:00
|
|
|
|
switch protocol {
|
|
|
|
|
|
case serverconfigs.ProtocolHTTP, serverconfigs.ProtocolHTTP4, serverconfigs.ProtocolHTTP6:
|
|
|
|
|
|
this.listener = &HTTPListener{
|
2020-10-01 16:00:52 +08:00
|
|
|
|
BaseListener: BaseListener{Group: this.group},
|
|
|
|
|
|
Listener: netListener,
|
2020-09-09 18:53:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
case serverconfigs.ProtocolHTTPS, serverconfigs.ProtocolHTTPS4, serverconfigs.ProtocolHTTPS6:
|
2021-12-18 19:17:40 +08:00
|
|
|
|
netListener.SetIsTLS(true)
|
2020-09-09 18:53:53 +08:00
|
|
|
|
this.listener = &HTTPListener{
|
2020-10-01 16:00:52 +08:00
|
|
|
|
BaseListener: BaseListener{Group: this.group},
|
2020-10-01 16:51:24 +08:00
|
|
|
|
Listener: netListener,
|
2020-09-09 18:53:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
case serverconfigs.ProtocolTCP, serverconfigs.ProtocolTCP4, serverconfigs.ProtocolTCP6:
|
|
|
|
|
|
this.listener = &TCPListener{
|
2020-10-01 16:51:24 +08:00
|
|
|
|
BaseListener: BaseListener{Group: this.group},
|
|
|
|
|
|
Listener: netListener,
|
2020-09-09 18:53:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
case serverconfigs.ProtocolTLS, serverconfigs.ProtocolTLS4, serverconfigs.ProtocolTLS6:
|
2021-12-18 19:17:40 +08:00
|
|
|
|
netListener.SetIsTLS(true)
|
2020-09-09 18:53:53 +08:00
|
|
|
|
this.listener = &TCPListener{
|
2020-10-01 16:51:24 +08:00
|
|
|
|
BaseListener: BaseListener{Group: this.group},
|
|
|
|
|
|
Listener: netListener,
|
2020-09-09 18:53:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
default:
|
2020-09-26 08:07:07 +08:00
|
|
|
|
return errors.New("unknown protocol '" + protocol.String() + "'")
|
2020-07-22 22:18:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-09-09 18:53:53 +08:00
|
|
|
|
this.listener.Init()
|
|
|
|
|
|
|
2021-12-08 15:17:45 +08:00
|
|
|
|
goman.New(func() {
|
2020-09-09 18:53:53 +08:00
|
|
|
|
err := this.listener.Serve()
|
2020-07-22 22:18:47 +08:00
|
|
|
|
if err != nil {
|
2020-10-28 11:19:06 +08:00
|
|
|
|
// 在这里屏蔽accept错误,防止在优雅关闭的时候有多余的提示
|
|
|
|
|
|
opErr, ok := err.(*net.OpError)
|
|
|
|
|
|
if ok && opErr.Op == "accept" {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 打印其他错误
|
2020-12-17 17:36:10 +08:00
|
|
|
|
remotelogs.Error("LISTENER", err.Error())
|
2020-07-22 22:18:47 +08:00
|
|
|
|
}
|
2021-12-08 15:17:45 +08:00
|
|
|
|
})
|
2020-07-21 11:18:47 +08:00
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 15:45:47 +08:00
|
|
|
|
func (this *Listener) listenUDP() error {
|
2022-09-14 17:18:00 +08:00
|
|
|
|
var addr = this.group.Addr()
|
|
|
|
|
|
|
|
|
|
|
|
var ipv4PacketListener *ipv4.PacketConn
|
|
|
|
|
|
var ipv6PacketListener *ipv6.PacketConn
|
|
|
|
|
|
|
|
|
|
|
|
host, _, err := net.SplitHostPort(addr)
|
2021-06-07 15:45:47 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
2022-09-14 17:18:00 +08:00
|
|
|
|
|
|
|
|
|
|
if len(host) == 0 {
|
|
|
|
|
|
// ipv4
|
|
|
|
|
|
ipv4Listener, err := this.createUDPIPv4Listener()
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
ipv4PacketListener = ipv4.NewPacketConn(ipv4Listener)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
remotelogs.Error("LISTENER", "create udp ipv4 listener '"+addr+"': "+err.Error())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ipv6
|
|
|
|
|
|
ipv6Listener, err := this.createUDPIPv6Listener()
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
ipv6PacketListener = ipv6.NewPacketConn(ipv6Listener)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
remotelogs.Error("LISTENER", "create udp ipv6 listener '"+addr+"': "+err.Error())
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if strings.Contains(host, ":") { // ipv6
|
|
|
|
|
|
ipv6Listener, err := this.createUDPIPv6Listener()
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
ipv6PacketListener = ipv6.NewPacketConn(ipv6Listener)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
remotelogs.Error("LISTENER", "create udp ipv6 listener '"+addr+"': "+err.Error())
|
|
|
|
|
|
}
|
|
|
|
|
|
} else { // ipv4
|
|
|
|
|
|
ipv4Listener, err := this.createUDPIPv4Listener()
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
ipv4PacketListener = ipv4.NewPacketConn(ipv4Listener)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
remotelogs.Error("LISTENER", "create udp ipv4 listener '"+addr+"': "+err.Error())
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-12 20:31:04 +08:00
|
|
|
|
events.OnKey(events.EventQuit, this, func() {
|
2021-06-07 15:45:47 +08:00
|
|
|
|
remotelogs.Println("LISTENER", "quit "+this.group.FullAddr())
|
2022-09-14 17:18:00 +08:00
|
|
|
|
|
|
|
|
|
|
if ipv4PacketListener != nil {
|
|
|
|
|
|
_ = ipv4PacketListener.Close()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if ipv6PacketListener != nil {
|
|
|
|
|
|
_ = ipv6PacketListener.Close()
|
|
|
|
|
|
}
|
2021-06-07 15:45:47 +08:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
this.listener = &UDPListener{
|
|
|
|
|
|
BaseListener: BaseListener{Group: this.group},
|
2022-09-14 17:18:00 +08:00
|
|
|
|
IPv4Listener: ipv4PacketListener,
|
|
|
|
|
|
IPv6Listener: ipv6PacketListener,
|
2021-06-07 15:45:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2021-12-08 15:17:45 +08:00
|
|
|
|
goman.New(func() {
|
2021-06-07 15:45:47 +08:00
|
|
|
|
err := this.listener.Serve()
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
remotelogs.Error("LISTENER", err.Error())
|
|
|
|
|
|
}
|
2021-12-08 15:17:45 +08:00
|
|
|
|
})
|
2021-06-07 15:45:47 +08:00
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-09-09 18:53:53 +08:00
|
|
|
|
func (this *Listener) Close() error {
|
2022-01-12 20:31:04 +08:00
|
|
|
|
events.Remove(this)
|
|
|
|
|
|
|
2020-09-09 18:53:53 +08:00
|
|
|
|
if this.listener == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return this.listener.Close()
|
2020-07-21 11:18:47 +08:00
|
|
|
|
}
|
2020-07-22 22:18:47 +08:00
|
|
|
|
|
2021-06-07 15:45:47 +08:00
|
|
|
|
// 创建TCP监听器
|
|
|
|
|
|
func (this *Listener) createTCPListener() (net.Listener, error) {
|
2022-06-29 21:58:41 +08:00
|
|
|
|
var listenConfig = net.ListenConfig{
|
2020-07-22 22:18:47 +08:00
|
|
|
|
Control: nil,
|
|
|
|
|
|
KeepAlive: 0,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
switch this.group.Protocol() {
|
2020-09-09 18:53:53 +08:00
|
|
|
|
case serverconfigs.ProtocolHTTP4, serverconfigs.ProtocolHTTPS4, serverconfigs.ProtocolTLS4:
|
2020-07-22 22:18:47 +08:00
|
|
|
|
return listenConfig.Listen(context.Background(), "tcp4", this.group.Addr())
|
2020-09-09 18:53:53 +08:00
|
|
|
|
case serverconfigs.ProtocolHTTP6, serverconfigs.ProtocolHTTPS6, serverconfigs.ProtocolTLS6:
|
2020-07-22 22:18:47 +08:00
|
|
|
|
return listenConfig.Listen(context.Background(), "tcp6", this.group.Addr())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return listenConfig.Listen(context.Background(), "tcp", this.group.Addr())
|
|
|
|
|
|
}
|
2021-06-07 15:45:47 +08:00
|
|
|
|
|
2022-09-14 17:18:00 +08:00
|
|
|
|
// 创建UDP IPv4监听器
|
|
|
|
|
|
func (this *Listener) createUDPIPv4Listener() (*net.UDPConn, error) {
|
|
|
|
|
|
addr, err := net.ResolveUDPAddr("udp", this.group.Addr())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
return net.ListenUDP("udp4", addr)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-06-07 15:45:47 +08:00
|
|
|
|
// 创建UDP监听器
|
2022-09-14 17:18:00 +08:00
|
|
|
|
func (this *Listener) createUDPIPv6Listener() (*net.UDPConn, error) {
|
2021-06-07 15:45:47 +08:00
|
|
|
|
addr, err := net.ResolveUDPAddr("udp", this.group.Addr())
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
2022-09-14 17:18:00 +08:00
|
|
|
|
return net.ListenUDP("udp6", addr)
|
2021-06-07 15:45:47 +08:00
|
|
|
|
}
|