udp.go 858 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package udp
  2. import (
  3. "fmt"
  4. "net"
  5. v2net "github.com/v2ray/v2ray-core/common/net"
  6. )
  7. type Server struct {
  8. Port uint16
  9. MsgProcessor func(msg []byte) []byte
  10. }
  11. func (server *Server) Start() (v2net.Address, error) {
  12. conn, err := net.ListenUDP("udp", &net.UDPAddr{
  13. IP: []byte{0, 0, 0, 0},
  14. Port: int(server.Port),
  15. Zone: "",
  16. })
  17. if err != nil {
  18. return nil, err
  19. }
  20. go server.handleConnection(conn)
  21. localAddr := conn.LocalAddr().(*net.UDPAddr)
  22. return v2net.IPAddress(localAddr.IP, uint16(localAddr.Port)), nil
  23. }
  24. func (server *Server) handleConnection(conn *net.UDPConn) {
  25. for {
  26. buffer := make([]byte, 2*1024)
  27. nBytes, addr, err := conn.ReadFromUDP(buffer)
  28. if err != nil {
  29. fmt.Printf("Failed to read from UDP: %v\n", err)
  30. continue
  31. }
  32. response := server.MsgProcessor(buffer[:nBytes])
  33. conn.WriteToUDP(response, addr)
  34. }
  35. }