conn.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package v2raygrpc
  2. import (
  3. "net"
  4. "os"
  5. "time"
  6. "github.com/sagernet/sing-box/common/baderror"
  7. "github.com/sagernet/sing/common"
  8. M "github.com/sagernet/sing/common/metadata"
  9. "github.com/sagernet/sing/common/rw"
  10. )
  11. var _ net.Conn = (*GRPCConn)(nil)
  12. type GRPCConn struct {
  13. GunService
  14. cancel common.ContextCancelCauseFunc
  15. cache []byte
  16. }
  17. func NewGRPCConn(service GunService, cancel common.ContextCancelCauseFunc) *GRPCConn {
  18. if client, isClient := service.(GunService_TunClient); isClient {
  19. service = &clientConnWrapper{client}
  20. }
  21. return &GRPCConn{
  22. GunService: service,
  23. cancel: cancel,
  24. }
  25. }
  26. func (c *GRPCConn) Read(b []byte) (n int, err error) {
  27. if len(c.cache) > 0 {
  28. n = copy(b, c.cache)
  29. c.cache = c.cache[n:]
  30. return
  31. }
  32. hunk, err := c.Recv()
  33. err = baderror.WrapGRPC(err)
  34. if err != nil {
  35. c.cancel(err)
  36. return
  37. }
  38. n = copy(b, hunk.Data)
  39. if n < len(hunk.Data) {
  40. c.cache = hunk.Data[n:]
  41. }
  42. return
  43. }
  44. func (c *GRPCConn) Write(b []byte) (n int, err error) {
  45. err = baderror.WrapGRPC(c.Send(&Hunk{Data: b}))
  46. if err != nil {
  47. c.cancel(err)
  48. return
  49. }
  50. return len(b), nil
  51. }
  52. func (c *GRPCConn) Close() error {
  53. c.cancel(net.ErrClosed)
  54. return nil
  55. }
  56. func (c *GRPCConn) LocalAddr() net.Addr {
  57. return M.Socksaddr{}
  58. }
  59. func (c *GRPCConn) RemoteAddr() net.Addr {
  60. return M.Socksaddr{}
  61. }
  62. func (c *GRPCConn) SetDeadline(t time.Time) error {
  63. return os.ErrInvalid
  64. }
  65. func (c *GRPCConn) SetReadDeadline(t time.Time) error {
  66. return os.ErrInvalid
  67. }
  68. func (c *GRPCConn) SetWriteDeadline(t time.Time) error {
  69. return os.ErrInvalid
  70. }
  71. func (c *GRPCConn) NeedAdditionalReadDeadline() bool {
  72. return true
  73. }
  74. func (c *GRPCConn) Upstream() any {
  75. return c.GunService
  76. }
  77. var _ rw.WriteCloser = (*clientConnWrapper)(nil)
  78. type clientConnWrapper struct {
  79. GunService_TunClient
  80. }
  81. func (c *clientConnWrapper) CloseWrite() error {
  82. return c.CloseSend()
  83. }