outbound.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package commander
  2. import (
  3. "context"
  4. "net"
  5. "v2ray.com/core/common/signal"
  6. "v2ray.com/core/transport/ray"
  7. )
  8. type OutboundListener struct {
  9. buffer chan net.Conn
  10. }
  11. func (l *OutboundListener) add(conn net.Conn) {
  12. select {
  13. case l.buffer <- conn:
  14. default:
  15. conn.Close()
  16. }
  17. }
  18. func (l *OutboundListener) Accept() (net.Conn, error) {
  19. c, open := <-l.buffer
  20. if !open {
  21. return nil, newError("listener closed")
  22. }
  23. return c, nil
  24. }
  25. func (l *OutboundListener) Close() error {
  26. close(l.buffer)
  27. return nil
  28. }
  29. func (l *OutboundListener) Addr() net.Addr {
  30. return &net.TCPAddr{
  31. IP: net.IP{0, 0, 0, 0},
  32. Port: 0,
  33. }
  34. }
  35. type CommanderOutbound struct {
  36. tag string
  37. listener *OutboundListener
  38. }
  39. func (co *CommanderOutbound) Dispatch(ctx context.Context, r ray.OutboundRay) {
  40. closeSignal := signal.NewNotifier()
  41. c := ray.NewConnection(r.OutboundInput(), r.OutboundOutput(), ray.ConnCloseSignal(closeSignal))
  42. co.listener.add(c)
  43. <-closeSignal.Wait()
  44. return
  45. }
  46. func (co *CommanderOutbound) Tag() string {
  47. return co.tag
  48. }
  49. func (co *CommanderOutbound) Start() error {
  50. return nil
  51. }
  52. func (co *CommanderOutbound) Close() {}