quic.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package transport
  2. import (
  3. "context"
  4. quic "github.com/lucas-clemente/quic-go"
  5. "net"
  6. )
  7. type QUIC struct {
  8. session quic.Session
  9. }
  10. func NewQUIC(serverSession quic.Session) *QUIC {
  11. return &QUIC{
  12. session: serverSession,
  13. }
  14. }
  15. func (qu *QUIC) Server() error {
  16. return nil
  17. }
  18. func (qu *QUIC) Accept() (net.Conn, error) {
  19. s, err := qu.session.AcceptStream(context.Background())
  20. if err != nil {
  21. return nil, err
  22. }
  23. return NewQUICConn(s, qu.session.RemoteAddr(), qu.session.LocalAddr()), nil
  24. }
  25. func (qu *QUIC) Addr() net.Addr {
  26. return qu.session.LocalAddr()
  27. }
  28. func (qu *QUIC) RemoteAddr() net.Addr {
  29. return qu.session.RemoteAddr()
  30. }
  31. func (qu *QUIC) Client() error {
  32. return nil
  33. }
  34. func (qu *QUIC) Open() (net.Conn, error) {
  35. s, err := qu.session.OpenStream()
  36. if err != nil {
  37. return nil, err
  38. }
  39. return NewQUICConn(s, qu.session.RemoteAddr(), qu.session.LocalAddr()), nil
  40. }
  41. func (qu *QUIC) Close() error {
  42. return qu.session.CloseWithError(1, "by npc")
  43. }
  44. type QUICConn struct {
  45. quic.Stream
  46. localAddr net.Addr
  47. remoteAddr net.Addr
  48. }
  49. func NewQUICConn(stream quic.Stream, rd net.Addr, ld net.Addr) *QUICConn {
  50. return &QUICConn{Stream: stream, localAddr: ld, remoteAddr: rd}
  51. }
  52. func (qc *QUICConn) LocalAddr() net.Addr {
  53. return qc.localAddr
  54. }
  55. func (qc *QUICConn) RemoteAddr() net.Addr {
  56. return qc.remoteAddr
  57. }