connection.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package connection
  2. import (
  3. "net"
  4. "sync"
  5. "time"
  6. //"git.giaever.org/joachimmg/go-log.git/log"
  7. "git.giaever.org/joachimmg/m-dns/config"
  8. )
  9. type Conn interface {
  10. Read(b []byte) (int, *net.UDPAddr, error)
  11. Write(b []byte, addr *net.UDPAddr) (int, error)
  12. Close() error
  13. Lock()
  14. RLock()
  15. WLock()
  16. RUnlock()
  17. WUnlock()
  18. Unlock()
  19. }
  20. type UDP interface {
  21. Conn
  22. Listening() bool
  23. Listen(addr *net.UDPAddr) error
  24. ListenMulticast(iface *net.Interface, addr *net.UDPAddr) error
  25. }
  26. type conn struct {
  27. *net.UDPConn
  28. r sync.Mutex
  29. w sync.Mutex
  30. }
  31. type UDP4 struct {
  32. conn
  33. }
  34. type UDP6 struct {
  35. conn
  36. }
  37. func New(net int) UDP {
  38. if net == 4 {
  39. return new(UDP4)
  40. }
  41. return new(UDP6)
  42. }
  43. func (c *conn) Lock() {
  44. c.RLock()
  45. c.WLock()
  46. }
  47. func (c *conn) RLock() {
  48. c.r.Lock()
  49. }
  50. func (c *conn) WLock() {
  51. c.w.Lock()
  52. }
  53. func (c *conn) Unlock() {
  54. c.RUnlock()
  55. c.WUnlock()
  56. }
  57. func (c *conn) RUnlock() {
  58. c.r.Unlock()
  59. }
  60. func (c *conn) WUnlock() {
  61. c.w.Unlock()
  62. }
  63. func (c *conn) Listening() bool {
  64. return c.UDPConn != nil
  65. }
  66. func (c *conn) Read(b []byte) (int, *net.UDPAddr, error) {
  67. c.RLock()
  68. defer c.RUnlock()
  69. if !c.Listening() {
  70. return 0, nil, nil
  71. }
  72. if config.BufReadDeadline > 0 {
  73. c.SetReadDeadline(time.Now().Add(config.BufReadDeadline * time.Second))
  74. }
  75. return c.ReadFromUDP(b)
  76. }
  77. func (c *conn) Write(b []byte, addr *net.UDPAddr) (int, error) {
  78. c.WLock()
  79. defer c.WUnlock()
  80. if !c.Listening() {
  81. return 0, nil
  82. }
  83. if config.BufWriteDeadline > 0 {
  84. c.SetWriteDeadline(time.Now().Add(config.BufWriteDeadline * time.Second))
  85. }
  86. return c.WriteToUDP(b, addr)
  87. }
  88. func (c *conn) Close() error {
  89. c.Lock()
  90. defer c.Unlock()
  91. if !c.Listening() {
  92. return nil
  93. }
  94. err := c.UDPConn.Close()
  95. c.UDPConn = nil
  96. return err
  97. }
  98. func (u *UDP4) Listen(addr *net.UDPAddr) error {
  99. var err error
  100. u.UDPConn, err = net.ListenUDP("udp4", addr)
  101. return err
  102. }
  103. func (u *UDP4) ListenMulticast(iface *net.Interface, addr *net.UDPAddr) error {
  104. var err error
  105. u.UDPConn, err = net.ListenMulticastUDP("udp4", iface, addr)
  106. return err
  107. }
  108. func (u *UDP6) Listen(addr *net.UDPAddr) error {
  109. var err error
  110. u.UDPConn, err = net.ListenUDP("udp6", addr)
  111. return err
  112. }
  113. func (u *UDP6) ListenMulticast(iface *net.Interface, addr *net.UDPAddr) error {
  114. var err error
  115. u.UDPConn, err = net.ListenMulticastUDP("udp6", iface, addr)
  116. return err
  117. }