server.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package sipc_conn
  2. import (
  3. "net"
  4. )
  5. type Server struct {
  6. isUnix bool
  7. serverPath string
  8. ctx ServerCtx
  9. listener net.Listener
  10. connErrorHandler ConnErrorHandler
  11. connHandler ConnHandler
  12. quitChan chan int
  13. }
  14. func (s *Server) GetPath() string {
  15. return s.serverPath
  16. }
  17. func (s *Server) IsUnix() bool {
  18. return s.isUnix
  19. }
  20. func (s *Server) IsWindows() bool {
  21. return !s.isUnix
  22. }
  23. func (s *Server) SetConnErrorHandler(handler ConnErrorHandler) {
  24. s.connErrorHandler = handler
  25. }
  26. func (s *Server) SetConnHandler(handler ConnHandler) {
  27. s.connHandler = handler
  28. }
  29. type ConnErrorHandler func(err error)
  30. type ConnHandler func(conn net.Conn)
  31. func defaultConnErrHandler(err error) {}
  32. func defaultConnHandler(conn net.Conn) {
  33. conn.Close()
  34. }
  35. func (s *Server) doAccept() {
  36. for {
  37. conn, err := s.listener.Accept()
  38. select {
  39. default:
  40. case <-s.quitChan:
  41. return
  42. }
  43. if err != nil {
  44. go s.connErrorHandler(err)
  45. } else {
  46. go s.connHandler(conn)
  47. }
  48. }
  49. }
  50. func (s *Server) Stop() error {
  51. close(s.quitChan)
  52. if s.listener != nil {
  53. return s.listener.Close()
  54. }
  55. return nil
  56. }