Guest User

Untitled

a guest
May 24th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.90 KB | None | 0 0
  1. from socket import *
  2.  
  3. class TCPSocket:
  4. """
  5. Socket wrapper
  6. Takes care of packet lengths and encryption
  7. """
  8. #Socket stuff
  9. _sock = None #Our socket
  10. _buffer = "" #Data buffer
  11. _host = ""
  12. _port = 0
  13.  
  14. #Callbacks
  15. _ondisc = None #Disconnect callback
  16.  
  17. def __init__(self, host="", port=0, ondisc=None):
  18. """
  19. Sets host, port and disconnect callback.
  20. Connects to host
  21. """
  22. self._host = host
  23. self._port = port
  24. self._ondisc = ondisc
  25.  
  26. if host != "" and port != 0:
  27. self._sock = socket(AF_INET, SOCK_STREAM)
  28. self._sock.setblocking(0)
  29. try: self._sock.connect((host, port))
  30. except: pass
  31.  
  32. def Receive(self):
  33. """
  34. Returns None if there is no packet
  35. Else returns the text of the packet
  36. """
  37. data = ''
  38. try: data = self._sock.recv(512)
  39. except: return None
  40.  
  41. if data == '':
  42. #Server disconnected
  43. self.Disconnect()
  44. return None
  45.  
  46. self._buffer += data
  47.  
  48. a = b = n = 0
  49. if len(self._buffer) < 2: return None
  50. a = ord(self._buffer[0:1]) - 1 #Remove 1 since we added 1 to avoid sending \o
  51. b = ord(self._buffer[1:2]) - 1
  52. n = ntohs((a << 8) | b) #Calculate packet length
  53.  
  54. if len(self._buffer) >= n:
  55. packet = self._buffer[2:n-1]
  56. self._buffer = self._buffer[n:]
  57. return packet
  58. else:
  59. return None
  60.  
  61. def Send(self, data):
  62. """
  63. Sends data to the server handles encryption
  64. Sends all of the data
  65. """
  66. total = len(data) + 2
  67. sent = 0
  68.  
  69. n = htons(total)
  70. a = ((n & 0xFF00) >> 8) + 1
  71. b = (n & 0xFF) + 1
  72.  
  73. data = chr(a) + chr(b) + data
  74.  
  75. while sent < total:
  76. t = self._sock.send(data[sent:])
  77. if t <= 0:
  78. self.Disconnect()
  79. return
  80. sent += t
  81.  
  82. def Disconnect(self):
  83. self._sock.close()
  84. self._ondisc()
Add Comment
Please, Sign In to add comment