Guest User

Untitled

a guest
Feb 20th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. def write_wait_response(self, buffer, timeout=30):
  2. '''
  3. Write and wait for response
  4. Params:
  5. Buffer BYTE encoded data
  6. Timeout timeout to wait for response
  7. Returns:
  8. response str if successful
  9. '''
  10. self.buffer = buffer
  11.  
  12. if self.waitLock(timeout):
  13. # condition var was signaled, we can return a response
  14. readbuf = bytes(self.readbuffer)
  15. self.readbuffer = b''
  16. return readbuf
  17. else:
  18. print("AsyncClientSocket: No response recieved from {} in {} seconds, dumping buffer".format(
  19. self.sa, timeout))
  20. self.buffer = ''
  21. raise TimeoutError("AsyncClientSocket Timed Out")
  22.  
  23. def handle_read(self):
  24. self.readbuffer, address = self.recvfrom(2048)
  25. print(self.readbuffer)
  26. print("notifying")
  27. self.cond.notifyAll()
  28.  
  29. waiting
  30. AsyncClientSocket: writing 5 bytes
  31. b'200,2' <- that's the server response
  32. notifying
  33.  
  34. error: uncaptured python exception, closing channel <my_socket_stuff.AsyncClientSocket connected 127.0.0.1:50000 at 0x1051bf438> (<class 'RuntimeError'>:cannot notify on un-acquired lock
  35.  
  36. class AsyncClientSocket(asyncore.dispatcher):
  37. def __init__(self, socketargs):
  38. asyncore.dispatcher.__init__(self)
  39. family, type, proto, canonname, sa = socketargs
  40. self.sa = sa
  41. self.create_socket(family, type)
  42.  
  43. if type == socket.SOCK_STREAM:
  44. self.connect( sa )
  45. elif type == socket.SOCK_DGRAM:
  46. pass
  47.  
  48. self.buffer = b''
  49. self.lock = threading.Lock()
  50. self.cond = threading.Condition(self.lock)
  51. self.readbuffer = b''
  52.  
  53. def write_wait_response(self, buffer, timeout=30):
  54. '''
  55. Write and wait for response
  56. Params:
  57. Buffer BYTE encoded data
  58. Timeout timeout to wait for response
  59. Returns:
  60. response str if successful
  61. '''
  62. self.buffer = buffer
  63.  
  64. if self.waitLock(timeout):
  65. # condition var was signaled, we can return a response
  66. readbuf = bytes(self.readbuffer)
  67. self.readbuffer = b''
  68. return readbuf
  69. else:
  70. print("AsyncClientSocket: No response recieved from {} in {} seconds, dumping buffer".format(
  71. self.sa, timeout))
  72. self.buffer = ''
  73. raise TimeoutError("AsyncClientSocket Timed Out")
  74.  
  75. def waitLock(self, timeout):
  76. '''
  77. Wait for timeout seconds on CV
  78. '''
  79. try:
  80. self.cond.acquire()
  81. print("waiting")
  82. return self.cond.wait(timeout)
  83. finally:
  84. self.cond.release()
  85.  
  86.  
  87. def handle_connect(self):
  88. pass
  89.  
  90. def handle_close(self):
  91. self.close()
  92.  
  93. def handle_read(self):
  94. self.readbuffer, address = self.recvfrom(2048)
  95. print(self.readbuffer)
  96. print("notifying")
  97. self.cond.notifyAll()
  98.  
  99. def writable(self):
  100. return (len(self.buffer) > 0)
  101.  
  102. def handle_write(self):
  103. print("AsyncClientSocket: writing {} bytes".format(len(self.buffer)))
  104. self.readbuffer = b''
  105. sent = self.sendto(self.buffer, self.sa)
  106. self.buffer = self.buffer[sent:]
Add Comment
Please, Sign In to add comment