@@ -6,9 +6,11 @@ import (
66 "io"
77 "net"
88 "os"
9+ "os/signal"
910 "path/filepath"
1011 "strings"
1112 "sync"
13+ "syscall"
1214 "time"
1315
1416 "github.com/fsnotify/fsnotify"
@@ -129,13 +131,20 @@ func watchConfig() *fsnotify.Watcher {
129131}
130132
131133func main () {
134+ if err := writePIDFile (); err != nil {
135+ panic (fmt .Sprintf ("Failed to write PID file: %v" , err ))
136+ }
137+ defer removePIDFile ()
138+
132139 if err := loadConfig (); err != nil {
133140 panic (err )
134141 }
135142
136143 watcher := watchConfig ()
137144 defer watcher .Close ()
138145
146+ go handleLogRotate ()
147+
139148 // 监听TCP端口
140149 listener , err := net .Listen ("tcp" , fmt .Sprintf (":%d" , config .Port ))
141150 if err != nil {
@@ -179,6 +188,8 @@ func handleRequest(conn net.Conn) {
179188 // 确保连接关闭
180189 defer conn .Close ()
181190
191+ setSocketOptions (conn )
192+
182193 buf := make ([]byte , 1024 )
183194 n , err := conn .Read (buf )
184195 if err != nil {
@@ -212,59 +223,39 @@ func handleRequest(conn net.Conn) {
212223 defer client .Close ()
213224
214225 client .Write (buf [:n ])
226+ // 不需要 buf 了,释放掉
227+ buf = nil
215228
216229 var wg sync.WaitGroup
217- wg .Add (2 )
230+ wg .Add (1 )
218231
219232 go handleRead (client , conn , & wg )
220- go handleWrite (client , conn , & wg )
233+ handleWrite (client , conn , nil )
221234
235+ // 等待所有读写操作完成
236+ // 不放在 defer 中,以防报错时无法关闭连接
222237 wg .Wait ()
223238}
224239
225240func handleRead (srv , cli net.Conn , wg * sync.WaitGroup ) {
226- defer func () {
227- wg .Done ()
228- srv .Close ()
229- cli .Close ()
230- }()
231-
232- buf := make ([]byte , 1024 )
233-
234- for {
235- n , err := srv .Read (buf )
236- if err != nil {
237- log .Err (err ).Msg ("Error reading from server" )
238- return
239- }
241+ if wg != nil {
242+ defer wg .Done ()
243+ }
240244
241- if _ , err := cli .Write (buf [:n ]); err != nil {
242- log .Err (err ).Msg ("Error writing to client" )
243- return
244- }
245+ _ , err := io .Copy (srv , cli )
246+ if err != nil && err != io .EOF {
247+ log .Err (err ).Msg ("Error copying data" )
245248 }
246249}
247250
248251func handleWrite (srv , cli net.Conn , wg * sync.WaitGroup ) {
249- defer func () {
250- wg .Done ()
251- srv .Close ()
252- cli .Close ()
253- }()
254-
255- buf := make ([]byte , 1024 )
256-
257- for {
258- n , err := cli .Read (buf )
259- if err != nil {
260- log .Err (err ).Msg ("Error reading from client" )
261- return
262- }
252+ if wg != nil {
253+ defer wg .Done ()
254+ }
263255
264- if _ , err := srv .Write (buf [:n ]); err != nil {
265- log .Err (err ).Msg ("Error writing to server" )
266- return
267- }
256+ _ , err := io .Copy (cli , srv )
257+ if err != nil && err != io .EOF {
258+ log .Err (err ).Msg ("Error copying data" )
268259 }
269260}
270261
@@ -287,3 +278,43 @@ func getMcHost(buf []byte) string {
287278 return host
288279 }
289280}
281+
282+ func setSocketOptions (conn net.Conn ) {
283+ if tcpConn , ok := conn .(* net.TCPConn ); ok {
284+ tcpConn .SetNoDelay (true ) // 禁用 Nagle 算法
285+ tcpConn .SetKeepAlive (true )
286+ tcpConn .SetKeepAlivePeriod (30 * time .Second )
287+ }
288+ }
289+
290+ func handleLogRotate () {
291+ signalChan := make (chan os.Signal , 1 )
292+ signal .Notify (signalChan , syscall .SIGHUP )
293+
294+ for range signalChan {
295+ log .Info ().Msg ("Received SIGHUP, reopening log file" )
296+ if err := reopenLogFile (); err != nil {
297+ log .Error ().Err (err ).Msg ("Failed to reopen log file" )
298+ }
299+ }
300+ }
301+
302+ func reopenLogFile () error {
303+ configLoadLock .Lock ()
304+ defer configLoadLock .Unlock ()
305+
306+ if config .Log .File == "" {
307+ return nil
308+ }
309+
310+ // 重新打开日志文件
311+ logFile , err := os .OpenFile (config .Log .File , os .O_CREATE | os .O_WRONLY | os .O_APPEND , 0644 )
312+ if err != nil {
313+ return err
314+ }
315+
316+ log .Logger = log .Logger .Output (io .MultiWriter (os .Stdout , logFile ))
317+ currentLogFile = config .Log .File
318+
319+ return nil
320+ }
0 commit comments