-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.go
112 lines (91 loc) · 2.48 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright 2024 TochusC AOSP Lab. All rights reserved.
// server.go 文件定义了 GoDNS 服务器的最顶层封装。
// GoDNS 服务器是一个易用、灵活的 DNS 服务器,
// 它可以监听指定的网络设备和端口,接收 DNS 请求并做出回复。
// GoStart 函数提供了一个一键启动 GoDNS 服务器的代码示例。
package godns
import (
"io"
"log"
"net"
"github.com/panjf2000/ants/v2"
)
// GoDNSServer 表示 GoDNS 服务器
// 其包含以下三部分:
// - ServerConfig: DNS 服务器配置
// - Sniffer: 数据包嗅探器
// - Handler: 数据包处理器
type GoDNSServer struct {
SeverConfig DNSServerConfig
// GoDNS 服务器的日志
GoDNSLogger *log.Logger
ThreadPool *ants.Pool
Netter Netter
Cacher Cacher
Responer Responser
}
func NewGoDNSServer(serverConf DNSServerConfig, responser Responser) *GoDNSServer {
godnsLogger := log.New(serverConf.LogWriter, "GoDNS: ", log.LstdFlags)
pool, err := ants.NewPool(serverConf.PoolCapcity)
if err != nil {
godnsLogger.Panicf("Error creating ants pool: %v", err)
}
netter := NewNetter(NetterConfig{
Port: serverConf.Port,
LogWriter: serverConf.LogWriter,
}, pool)
cacher := NewCacher(CacherConfig{
CacheLocation: serverConf.CacheLocation,
LogWriter: serverConf.LogWriter,
}, pool)
return &GoDNSServer{
SeverConfig: serverConf,
GoDNSLogger: godnsLogger,
ThreadPool: pool,
Netter: *netter,
Cacher: *cacher,
Responer: responser,
}
}
func (s *GoDNSServer) HandleConnection(connInfo ConnectionInfo) {
// 从缓存中查找响应
if s.SeverConfig.EnebleCache {
cache, err := s.Cacher.FetchCache(connInfo)
if err == nil {
s.Netter.Send(connInfo, cache)
return
}
}
resp, err := s.Responer.Response(connInfo)
if err != nil {
s.GoDNSLogger.Printf("Error generating response: %v", err)
return
}
s.Netter.Send(connInfo, resp)
if s.SeverConfig.EnebleCache {
s.Cacher.CacheResponse(resp)
}
}
// Start 启动 GoDNS 服务器
func (s *GoDNSServer) Start() {
// GoDNS 启动!
s.GoDNSLogger.Printf("GoDNS Starts!")
connChan := s.Netter.Sniff()
for connInfo := range connChan {
s.ThreadPool.Submit(func() { s.HandleConnection(connInfo) })
}
}
// DNSServerConfig 记录 DNS 服务器的相关配置
type DNSServerConfig struct {
// DNS 服务器的 IP 地址
IP net.IP
// DNS 服务器的端口
Port int
// 日志输出
LogWriter io.Writer
// 线程池容量
PoolCapcity int
// 缓存功能
EnebleCache bool
CacheLocation string
}