listener.go 677 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package gateway
  2. import (
  3. "io"
  4. "net"
  5. "sync/atomic"
  6. )
  7. type Listener struct {
  8. addr net.Addr
  9. ch chan net.Conn
  10. exitFlag int32
  11. }
  12. func (l *Listener) Receive(conn net.Conn) {
  13. select {
  14. case l.ch <- conn:
  15. default:
  16. }
  17. }
  18. func (l *Listener) Accept() (net.Conn, error) {
  19. select {
  20. case c, ok := <-l.ch:
  21. if ok {
  22. return c, nil
  23. }
  24. return nil, io.ErrClosedPipe
  25. }
  26. }
  27. func (l *Listener) Close() error {
  28. if atomic.CompareAndSwapInt32(&l.exitFlag, 0, 1) {
  29. close(l.ch)
  30. }
  31. return nil
  32. }
  33. func (l *Listener) Addr() net.Addr {
  34. return l.addr
  35. }
  36. func NewListener(addr net.Addr) *Listener {
  37. l := &Listener{
  38. addr: addr,
  39. ch: make(chan net.Conn, 5),
  40. }
  41. return l
  42. }