listener.go 818 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package entry
  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. exitChan chan struct{}
  12. }
  13. func (l *Listener) Receive(conn net.Conn) {
  14. select {
  15. case l.ch <- conn:
  16. case <-l.exitChan:
  17. }
  18. }
  19. func (l *Listener) Accept() (net.Conn, error) {
  20. select {
  21. case conn, ok := <-l.ch:
  22. if ok {
  23. return conn, nil
  24. } else {
  25. return nil, io.ErrClosedPipe
  26. }
  27. case <-l.exitChan:
  28. return nil, io.ErrClosedPipe
  29. }
  30. }
  31. func (l *Listener) Close() error {
  32. if atomic.CompareAndSwapInt32(&l.exitFlag, 0, 1) {
  33. close(l.exitChan)
  34. }
  35. return nil
  36. }
  37. func (l *Listener) Addr() net.Addr {
  38. return l.addr
  39. }
  40. func newListener(addr net.Addr) *Listener {
  41. return &Listener{
  42. addr: addr,
  43. ch: make(chan net.Conn, 10),
  44. exitChan: make(chan struct{}),
  45. }
  46. }