NetTool.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package NetUtils
  2. import (
  3. "bufio"
  4. "encoding/binary"
  5. "errors"
  6. "github.com/astaxie/beego/logs"
  7. "io"
  8. "net"
  9. "forward-core/Common"
  10. )
  11. func NewTCP(addr string) (net.Listener, error) {
  12. tcpSocket, err := net.Listen("tcp", addr)
  13. if err != nil {
  14. return nil, err
  15. }
  16. return tcpSocket,nil
  17. }
  18. func NewUDP(addr string) (*net.UDPConn, error) {
  19. udpAddr, err := net.ResolveUDPAddr("udp", addr)
  20. if err != nil {
  21. return nil, err
  22. }
  23. udpSocket, _err := net.ListenUDP("udp", udpAddr)
  24. if _err != nil {
  25. return nil, _err
  26. }
  27. return udpSocket,nil
  28. }
  29. func NewKCP(addr string, setting *Common.KcpSetting) (*Common.UDPListener, error) {
  30. return Common.NewKCP(addr, setting)
  31. }
  32. func DataCopy(dst io.Writer, src io.Reader) (written int64, err error) {
  33. return io.Copy(dst, src)
  34. }
  35. func MultiDataCopy(src io.Reader, dispatchConns []io.Writer) (written int64, err error) {
  36. mWriter := io.MultiWriter(dispatchConns...)
  37. return io.Copy(mWriter, src)
  38. }
  39. type ReadCallBack func(conn net.Conn, id int, cmd byte, arg []byte)
  40. func ReadConn(conn net.Conn, callback ReadCallBack) {
  41. scanner := bufio.NewScanner(conn)
  42. scanner.Split(func(data []byte, atEOF bool) (adv int, token []byte, err error) {
  43. return NetSplitV1(data, atEOF, conn, callback)
  44. })
  45. for scanner.Scan() {
  46. }
  47. if scanner.Err() != nil {
  48. logs.Error(scanner.Err())
  49. }
  50. }
  51. func NetSplitV1(data []byte, atEOF bool, conn net.Conn, callback ReadCallBack) (adv int, token []byte, err error) {
  52. l := len(data)
  53. if l < 6 {
  54. return 0, nil, nil
  55. }
  56. if l > 100000 {
  57. conn.Close()
  58. return 0, nil, errors.New("max data")
  59. }
  60. var id int
  61. var cmd byte
  62. id = int(int32(data[0]) | int32(data[1])<<8 | int32(data[2])<<16 | int32(data[3])<<24)
  63. cmd = data[4]
  64. isShort := data[5]
  65. var payload []byte
  66. var offset int
  67. if isShort == 1 {
  68. offset = 6
  69. } else {
  70. if l < 10 {
  71. return 0, nil, nil
  72. }
  73. ls := binary.LittleEndian.Uint32(data[6:])
  74. tail := l - 10
  75. if tail < int(ls) {
  76. return 0, nil, nil
  77. }
  78. payload = data[10 : 10+ls]
  79. offset = 10 + int(ls)
  80. }
  81. callback(conn, id, cmd, payload)
  82. return offset, []byte{}, nil
  83. }
  84. func WriteConn(conn net.Conn, id int, cmd byte, payload []byte) error {
  85. if conn == nil {
  86. return nil
  87. }
  88. l := len(payload)
  89. var buf []byte
  90. var size int
  91. if l > 0 {
  92. size = 10 + l
  93. //4+1+1+4 id cmd isShort
  94. buf = make([]byte, size)
  95. } else {
  96. size = 6
  97. //4+1+1 id cmd isShort
  98. buf = make([]byte, size)
  99. }
  100. buf[0] = byte(id)
  101. buf[1] = byte(id >> 8)
  102. buf[2] = byte(id >> 16)
  103. buf[3] = byte(id >> 24)
  104. buf[4] = cmd
  105. if l > 0 {
  106. buf[5] = 0
  107. binary.LittleEndian.PutUint32(buf[6:], uint32(l))
  108. copy(buf[10:], []byte(payload))
  109. } else {
  110. buf[5] = 1
  111. }
  112. _, err := conn.Write(buf[:size])
  113. if err != nil {
  114. logs.Error("conn.Write error:", err)
  115. }
  116. return err
  117. }
粤ICP备19079148号