conn.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package quic
  2. import (
  3. "time"
  4. quic "github.com/lucas-clemente/quic-go"
  5. "v2ray.com/core/common/net"
  6. "v2ray.com/core/transport/internet"
  7. )
  8. type sysConn struct {
  9. conn net.PacketConn
  10. header internet.PacketHeader
  11. }
  12. func (c *sysConn) ReadFrom(p []byte) (int, net.Addr, error) {
  13. if c.header == nil {
  14. return c.conn.ReadFrom(p)
  15. }
  16. overhead := int(c.header.Size())
  17. buffer := getBuffer()
  18. defer putBuffer(buffer)
  19. nBytes, addr, err := c.conn.ReadFrom(buffer[:len(p)+overhead])
  20. if err != nil {
  21. return 0, nil, err
  22. }
  23. copy(p, buffer[overhead:nBytes])
  24. return nBytes - overhead, addr, nil
  25. }
  26. func (c *sysConn) WriteTo(p []byte, addr net.Addr) (int, error) {
  27. if c.header == nil {
  28. return c.conn.WriteTo(p, addr)
  29. }
  30. buffer := getBuffer()
  31. defer putBuffer(buffer)
  32. overhead := int(c.header.Size())
  33. c.header.Serialize(buffer)
  34. copy(buffer[overhead:], p)
  35. nBytes, err := c.conn.WriteTo(buffer[:len(p)+overhead], addr)
  36. if err != nil {
  37. return 0, err
  38. }
  39. return nBytes - overhead, nil
  40. }
  41. func (c *sysConn) Close() error {
  42. return c.conn.Close()
  43. }
  44. func (c *sysConn) LocalAddr() net.Addr {
  45. return c.conn.LocalAddr()
  46. }
  47. func (c *sysConn) SetDeadline(t time.Time) error {
  48. return c.conn.SetDeadline(t)
  49. }
  50. func (c *sysConn) SetReadDeadline(t time.Time) error {
  51. return c.conn.SetReadDeadline(t)
  52. }
  53. func (c *sysConn) SetWriteDeadline(t time.Time) error {
  54. return c.conn.SetWriteDeadline(t)
  55. }
  56. type interConn struct {
  57. stream quic.Stream
  58. local net.Addr
  59. remote net.Addr
  60. }
  61. func (c *interConn) Read(b []byte) (int, error) {
  62. return c.stream.Read(b)
  63. }
  64. func (c *interConn) Write(b []byte) (int, error) {
  65. return c.stream.Write(b)
  66. }
  67. func (c *interConn) Close() error {
  68. return c.stream.Close()
  69. }
  70. func (c *interConn) LocalAddr() net.Addr {
  71. return c.local
  72. }
  73. func (c *interConn) RemoteAddr() net.Addr {
  74. return c.remote
  75. }
  76. func (c *interConn) SetDeadline(t time.Time) error {
  77. return c.stream.SetDeadline(t)
  78. }
  79. func (c *interConn) SetReadDeadline(t time.Time) error {
  80. return c.stream.SetReadDeadline(t)
  81. }
  82. func (c *interConn) SetWriteDeadline(t time.Time) error {
  83. return c.stream.SetWriteDeadline(t)
  84. }