tcp_server.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // tcp server library.
  2. package server
  3. import (
  4. "crypto/tls"
  5. "net"
  6. )
  7. type TCPHandler interface {
  8. Handle(net.Conn)
  9. }
  10. type TCPServer struct {
  11. addr *addr
  12. handler TCPHandler
  13. useTls bool
  14. }
  15. // start will keep accepting and serving tcp connections.
  16. func (ts *TCPServer) Start() error {
  17. // check for conditions
  18. if ts.handler == nil {
  19. return errorf(errTCPHandlerNotRegistered)
  20. }
  21. // listen
  22. var ln net.Listener
  23. var err error
  24. if ts.useTls {
  25. // if use tls, then load pem files and start server
  26. if *confCAFile == "" {
  27. return errorf(errMissingFlag, FlagCAFile)
  28. }
  29. if *confKeyFile == "" {
  30. return errorf(errMissingFlag, FlagKeyFile)
  31. }
  32. // process key files
  33. cert, err := tls.LoadX509KeyPair(*confCAFile, *confKeyFile)
  34. if err != nil {
  35. return errorf(errLoadSecureKey, err.Error())
  36. }
  37. // config server with tls
  38. config := tls.Config{Certificates: []tls.Certificate{cert}}
  39. // listen for new connection
  40. ln, err = tls.Listen("tcp4", ts.addr.internalIp, &config)
  41. if err != nil {
  42. return errorf(errListenFailed, ts.addr, err)
  43. }
  44. } else {
  45. // don't use tls, just listen
  46. ln, err = net.Listen("tcp4", ts.addr.internalIp)
  47. if err != nil {
  48. return errorf(errListenFailed, ts.addr, err)
  49. }
  50. }
  51. Log.Infof("TCP Server Listen on %s, use tls: %v", ts.addr, ts.useTls)
  52. // continously accept connections and serve, nonblock
  53. go func() {
  54. for {
  55. conn, err := ln.Accept()
  56. if err != nil {
  57. Log.Errorf(errNewConnection, err.Error())
  58. continue
  59. }
  60. Log.Infof("accepting new connection %s", conn.RemoteAddr())
  61. go ts.handler.Handle(conn)
  62. }
  63. }()
  64. return nil
  65. }