listener.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package conn
  2. import (
  3. "net"
  4. "strings"
  5. "github.com/astaxie/beego/logs"
  6. "github.com/xtaci/kcp-go"
  7. )
  8. func NewTcpListenerAndProcess(addr string, f func(c net.Conn), listener *net.Listener) error {
  9. var err error
  10. *listener, err = net.Listen("tcp", addr)
  11. if err != nil {
  12. return err
  13. }
  14. Accept(*listener, f)
  15. return nil
  16. }
  17. func NewKcpListenerAndProcess(addr string, f func(c net.Conn)) error {
  18. kcpListener, err := kcp.ListenWithOptions(addr, nil, 150, 3)
  19. if err != nil {
  20. logs.Error(err)
  21. return err
  22. }
  23. for {
  24. c, err := kcpListener.AcceptKCP()
  25. SetUdpSession(c)
  26. if err != nil {
  27. logs.Warn(err)
  28. continue
  29. }
  30. go f(c)
  31. }
  32. return nil
  33. }
  34. func Accept(l net.Listener, f func(c net.Conn)) {
  35. for {
  36. c, err := l.Accept()
  37. if err != nil {
  38. if strings.Contains(err.Error(), "use of closed network connection") {
  39. break
  40. }
  41. if strings.Contains(err.Error(), "the mux has closed") {
  42. break
  43. }
  44. logs.Warn(err)
  45. continue
  46. }
  47. if c == nil {
  48. logs.Warn("nil connection")
  49. break
  50. }
  51. go f(c)
  52. }
  53. }