session.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package TcpServer
  2. import (
  3. "Yunlot/models/Device"
  4. "net"
  5. )
  6. // Session holds info about connection
  7. type Session struct {
  8. conn net.Conn
  9. Server *server
  10. Device Device.Device
  11. Verify_num int
  12. }
  13. func (session *Session) handleTcpRead() {
  14. session.Server.onNewClientCallback(session)
  15. var startRecvPos int16
  16. var result int
  17. recviveBuff := make([]byte, MAX_RECEIVE_BUFFER_SIZE)
  18. for {
  19. recvBytes, err := session.conn.Read(recviveBuff[startRecvPos:])
  20. if err != nil {
  21. session.closeProcess(NET_CLOSE_REMOTE)
  22. return
  23. }
  24. if recvBytes < HEADER_SIZE {
  25. session.closeProcess(NET_CLOSE_RECV_TOO_SMALL_RECV_DATA)
  26. return
  27. }
  28. readAbleByte := int16(startRecvPos) + int16(recvBytes)
  29. startRecvPos, result = session.makePacket(readAbleByte, recviveBuff)
  30. if result != NET_ERROR_NONE {
  31. session.closeProcess(result)
  32. return
  33. }
  34. }
  35. }
  36. func (session *Session) closeProcess(reason int) {
  37. session.conn.Close()
  38. session.Server.onClientConnectionClosed(session, reason)
  39. }
  40. func (session *Session) makePacket(readAbleByte int16, recviveBuff []byte) (int16, int) {
  41. var startRecvPos int16 = 0
  42. var readPos int16
  43. for {
  44. if readAbleByte < HEADER_SIZE {
  45. break
  46. }
  47. requireDataSize := packetTotalSize(recviveBuff[readPos:])
  48. if requireDataSize > readAbleByte {
  49. break
  50. }
  51. if requireDataSize > MAX_PACKET_SIZE {
  52. return startRecvPos, NET_ERROR_RECV_MAKE_PACKET_TOO_LARGE_PACKET_SIZE
  53. }
  54. ltvPacket := recviveBuff[readPos:(readPos + requireDataSize)]
  55. readPos += requireDataSize
  56. readAbleByte -= requireDataSize
  57. session.Server.onNewMessage(session, ltvPacket)
  58. }
  59. if readAbleByte > 0 {
  60. copy(recviveBuff, recviveBuff[readPos:(readPos+readAbleByte)])
  61. }
  62. startRecvPos = readAbleByte
  63. return startRecvPos, NET_ERROR_NONE
  64. }
  65. // Send text message to client
  66. func (session *Session) Send(message string) error {
  67. _, err := session.conn.Write([]byte(message))
  68. return err
  69. }
  70. // Send bytes to client
  71. func (session *Session) SendBytes(b []byte) error {
  72. _, err := session.conn.Write(b)
  73. return err
  74. }
  75. func (session *Session) Conn() net.Conn {
  76. return session.conn
  77. }
  78. func (session *Session) Close() error {
  79. return session.conn.Close()
  80. }