send_conn.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package quic
  2. import (
  3. "net"
  4. )
  5. // A sendConn allows sending using a simple Write() on a non-connected packet conn.
  6. type sendConn interface {
  7. Write([]byte) error
  8. Close() error
  9. LocalAddr() net.Addr
  10. RemoteAddr() net.Addr
  11. }
  12. type sconn struct {
  13. connection
  14. remoteAddr net.Addr
  15. info *packetInfo
  16. oob []byte
  17. }
  18. var _ sendConn = &sconn{}
  19. func newSendConn(c connection, remote net.Addr, info *packetInfo) sendConn {
  20. return &sconn{
  21. connection: c,
  22. remoteAddr: remote,
  23. info: info,
  24. oob: info.OOB(),
  25. }
  26. }
  27. func (c *sconn) Write(p []byte) error {
  28. _, err := c.WritePacket(p, c.remoteAddr, c.oob)
  29. return err
  30. }
  31. func (c *sconn) RemoteAddr() net.Addr {
  32. return c.remoteAddr
  33. }
  34. func (c *sconn) LocalAddr() net.Addr {
  35. addr := c.connection.LocalAddr()
  36. if c.info != nil {
  37. if udpAddr, ok := addr.(*net.UDPAddr); ok {
  38. addrCopy := *udpAddr
  39. addrCopy.IP = c.info.addr
  40. addr = &addrCopy
  41. }
  42. }
  43. return addr
  44. }
  45. type spconn struct {
  46. net.PacketConn
  47. remoteAddr net.Addr
  48. }
  49. var _ sendConn = &spconn{}
  50. func newSendPconn(c net.PacketConn, remote net.Addr) sendConn {
  51. return &spconn{PacketConn: c, remoteAddr: remote}
  52. }
  53. func (c *spconn) Write(p []byte) error {
  54. _, err := c.WriteTo(p, c.remoteAddr)
  55. return err
  56. }
  57. func (c *spconn) RemoteAddr() net.Addr {
  58. return c.remoteAddr
  59. }