Hunter0x7c7
2022-08-11 b8230139fb40edea387617b6accd8371e37eda58
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
package udp
 
import (
    "fmt"
 
    "github.com/v2fly/v2ray-core/v5/common/net"
)
 
type Server struct {
    Port         net.Port
    MsgProcessor func(msg []byte) []byte
    accepting    bool
    conn         *net.UDPConn
}
 
func (server *Server) Start() (net.Destination, error) {
    conn, err := net.ListenUDP("udp", &net.UDPAddr{
        IP:   []byte{127, 0, 0, 1},
        Port: int(server.Port),
        Zone: "",
    })
    if err != nil {
        return net.Destination{}, err
    }
    server.Port = net.Port(conn.LocalAddr().(*net.UDPAddr).Port)
    fmt.Println("UDP server started on port ", server.Port)
 
    server.conn = conn
    go server.handleConnection(conn)
 
    localAddr := conn.LocalAddr().(*net.UDPAddr)
    return net.UDPDestination(net.IPAddress(localAddr.IP), net.Port(localAddr.Port)), nil
}
 
func (server *Server) handleConnection(conn *net.UDPConn) {
    server.accepting = true
    for server.accepting {
        buffer := make([]byte, 2*1024)
        nBytes, addr, err := conn.ReadFromUDP(buffer)
        if err != nil {
            fmt.Printf("Failed to read from UDP: %v\n", err)
            continue
        }
 
        response := server.MsgProcessor(buffer[:nBytes])
        if _, err := conn.WriteToUDP(response, addr); err != nil {
            fmt.Println("Failed to write to UDP: ", err.Error())
        }
    }
}
 
func (server *Server) Close() error {
    server.accepting = false
    return server.conn.Close()
}