tcp.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package tcp
  2. import (
  3. "fmt"
  4. "io"
  5. "net"
  6. v2net "v2ray.com/core/common/net"
  7. )
  8. type Server struct {
  9. Port v2net.Port
  10. MsgProcessor func(msg []byte) []byte
  11. SendFirst []byte
  12. Listen v2net.Address
  13. accepting bool
  14. listener *net.TCPListener
  15. }
  16. func (server *Server) Start() (v2net.Destination, error) {
  17. listenerAddr := server.Listen
  18. if listenerAddr == nil {
  19. listenerAddr = v2net.LocalHostIP
  20. }
  21. listener, err := net.ListenTCP("tcp", &net.TCPAddr{
  22. IP: listenerAddr.IP(),
  23. Port: int(server.Port),
  24. Zone: "",
  25. })
  26. if err != nil {
  27. return v2net.Destination{}, err
  28. }
  29. server.Port = v2net.Port(listener.Addr().(*v2net.TCPAddr).Port)
  30. server.listener = listener
  31. go server.acceptConnections(listener)
  32. localAddr := listener.Addr().(*v2net.TCPAddr)
  33. return v2net.TCPDestination(v2net.IPAddress(localAddr.IP), v2net.Port(localAddr.Port)), nil
  34. }
  35. func (server *Server) acceptConnections(listener *net.TCPListener) {
  36. server.accepting = true
  37. for server.accepting {
  38. conn, err := listener.Accept()
  39. if err != nil {
  40. fmt.Printf("Failed accept TCP connection: %v\n", err)
  41. continue
  42. }
  43. go server.handleConnection(conn)
  44. }
  45. }
  46. func (server *Server) handleConnection(conn net.Conn) {
  47. if len(server.SendFirst) > 0 {
  48. conn.Write(server.SendFirst)
  49. }
  50. request := make([]byte, 4096)
  51. for {
  52. nBytes, err := conn.Read(request)
  53. if err != nil {
  54. if err != io.EOF {
  55. fmt.Println("Failed to read request:", err)
  56. }
  57. break
  58. }
  59. response := server.MsgProcessor(request[:nBytes])
  60. if _, err := conn.Write(response); err != nil {
  61. fmt.Println("Failed to write response:", err)
  62. break
  63. }
  64. }
  65. conn.Close()
  66. }
  67. func (v *Server) Close() {
  68. v.accepting = false
  69. v.listener.Close()
  70. }