| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | 
							- package udp
 
- import (
 
- 	"fmt"
 
- 	"v2ray.com/core/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()
 
- }
 
 
  |