server.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package v2rayquic
  2. import (
  3. "context"
  4. "net"
  5. "os"
  6. "github.com/sagernet/quic-go"
  7. "github.com/sagernet/sing-box/adapter"
  8. "github.com/sagernet/sing-box/common/tls"
  9. C "github.com/sagernet/sing-box/constant"
  10. "github.com/sagernet/sing-box/option"
  11. "github.com/sagernet/sing-box/transport/hysteria"
  12. "github.com/sagernet/sing/common"
  13. E "github.com/sagernet/sing/common/exceptions"
  14. M "github.com/sagernet/sing/common/metadata"
  15. N "github.com/sagernet/sing/common/network"
  16. )
  17. var _ adapter.V2RayServerTransport = (*Server)(nil)
  18. type Server struct {
  19. ctx context.Context
  20. tlsConfig *tls.STDConfig
  21. quicConfig *quic.Config
  22. handler adapter.V2RayServerTransportHandler
  23. errorHandler E.Handler
  24. udpListener net.PacketConn
  25. quicListener quic.Listener
  26. }
  27. func NewServer(ctx context.Context, options option.V2RayQUICOptions, tlsConfig tls.ServerConfig, handler adapter.V2RayServerTransportHandler) (adapter.V2RayServerTransport, error) {
  28. quicConfig := &quic.Config{
  29. DisablePathMTUDiscovery: !C.IsLinux && !C.IsWindows,
  30. }
  31. stdConfig, err := tlsConfig.Config()
  32. if err != nil {
  33. return nil, err
  34. }
  35. if len(stdConfig.NextProtos) == 0 {
  36. stdConfig.NextProtos = []string{"h2", "http/1.1"}
  37. }
  38. server := &Server{
  39. ctx: ctx,
  40. tlsConfig: stdConfig,
  41. quicConfig: quicConfig,
  42. handler: handler,
  43. }
  44. return server, nil
  45. }
  46. func (s *Server) Network() []string {
  47. return []string{N.NetworkUDP}
  48. }
  49. func (s *Server) Serve(listener net.Listener) error {
  50. return os.ErrInvalid
  51. }
  52. func (s *Server) ServePacket(listener net.PacketConn) error {
  53. quicListener, err := quic.Listen(listener, s.tlsConfig, s.quicConfig)
  54. if err != nil {
  55. return err
  56. }
  57. s.udpListener = listener
  58. s.quicListener = quicListener
  59. go s.acceptLoop()
  60. return nil
  61. }
  62. func (s *Server) acceptLoop() {
  63. for {
  64. conn, err := s.quicListener.Accept(s.ctx)
  65. if err != nil {
  66. return
  67. }
  68. go func() {
  69. hErr := s.streamAcceptLoop(conn)
  70. if hErr != nil {
  71. s.errorHandler.NewError(conn.Context(), hErr)
  72. }
  73. }()
  74. }
  75. }
  76. func (s *Server) streamAcceptLoop(conn quic.Connection) error {
  77. for {
  78. stream, err := conn.AcceptStream(s.ctx)
  79. if err != nil {
  80. return err
  81. }
  82. go s.handler.NewConnection(conn.Context(), &hysteria.StreamWrapper{Conn: conn, Stream: stream}, M.Metadata{})
  83. }
  84. }
  85. func (s *Server) Close() error {
  86. return common.Close(s.udpListener, s.quicListener)
  87. }