conn.go 880 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package quic
  2. import (
  3. "net"
  4. "sync"
  5. )
  6. type connection interface {
  7. Write([]byte) error
  8. Read([]byte) (int, net.Addr, error)
  9. Close() error
  10. LocalAddr() net.Addr
  11. RemoteAddr() net.Addr
  12. SetCurrentRemoteAddr(net.Addr)
  13. }
  14. type conn struct {
  15. mutex sync.RWMutex
  16. pconn net.PacketConn
  17. currentAddr net.Addr
  18. }
  19. var _ connection = &conn{}
  20. func (c *conn) Write(p []byte) error {
  21. _, err := c.pconn.WriteTo(p, c.currentAddr)
  22. return err
  23. }
  24. func (c *conn) Read(p []byte) (int, net.Addr, error) {
  25. return c.pconn.ReadFrom(p)
  26. }
  27. func (c *conn) SetCurrentRemoteAddr(addr net.Addr) {
  28. c.mutex.Lock()
  29. c.currentAddr = addr
  30. c.mutex.Unlock()
  31. }
  32. func (c *conn) LocalAddr() net.Addr {
  33. return c.pconn.LocalAddr()
  34. }
  35. func (c *conn) RemoteAddr() net.Addr {
  36. c.mutex.RLock()
  37. addr := c.currentAddr
  38. c.mutex.RUnlock()
  39. return addr
  40. }
  41. func (c *conn) Close() error {
  42. return c.pconn.Close()
  43. }