server.go 927 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package tcp
  2. import (
  3. "fmt"
  4. "log"
  5. "net"
  6. "os"
  7. "os/signal"
  8. "syscall"
  9. )
  10. // NewServer make TCP server
  11. func NewServer(addr string, cb func(*net.TCPConn)) {
  12. logger := log.New(os.Stdout, "INFO: ", log.LstdFlags)
  13. errc := make(chan error)
  14. go func() {
  15. c := make(chan os.Signal)
  16. signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
  17. errc <- fmt.Errorf("%s", <-c)
  18. }()
  19. tcpaddr, err := net.ResolveTCPAddr("tcp", addr)
  20. if err != nil {
  21. logger.Fatalf("listen error: %v", err)
  22. return
  23. }
  24. listen, err := net.ListenTCP("tcp", tcpaddr)
  25. if err != nil {
  26. logger.Fatalf("listen error: %v", err)
  27. return
  28. }
  29. defer listen.Close()
  30. go func() {
  31. logger.Println("TCP Listen", addr)
  32. for {
  33. conn, err := listen.AcceptTCP()
  34. if err != nil {
  35. errc <- err
  36. logger.Fatalf("accept error: %v", err)
  37. break
  38. }
  39. go cb(conn)
  40. }
  41. logger.Println("Exit server", "Quit")
  42. }()
  43. logger.Println("TCP Service Exit", <-errc)
  44. }