Advertisement
Guest User

Untitled

a guest
Feb 21st, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. import asyncio
  4. import logging
  5. import pickle
  6. import os
  7. import binascii
  8. import sys
  9.  
  10.  
  11. logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(message)s")
  12. peer_id = os.urandom(32)
  13. res_id = os.urandom(32) if len(sys.argv) < 4 else binascii.a2b_hex(sys.argv[3])
  14. logging.info('\npeer_id: %s\nres_id: %s', binascii.b2a_hex(
  15. peer_id), binascii.b2a_hex(res_id))
  16.  
  17.  
  18. class TrackerClientProtocol:
  19.  
  20. def __init__(self):
  21. pass
  22.  
  23. def connection_made(self, transport):
  24. self.transport = transport
  25.  
  26. def sendto(self, message, addr):
  27. self.transport.sendto(pickle.dumps(message), addr)
  28.  
  29. def datagram_received(self, data, addr):
  30. message = pickle.loads(data)
  31.  
  32. if 'type' in message:
  33. logging.debug('received datagram %s from %s', message['type'], addr)
  34.  
  35. if message['type'] == 'echo-request':
  36. message['type'] = 'echo-response'
  37. self.sendto(message, addr)
  38. elif message['type'] == 'echo-response':
  39. pass
  40. elif message['type'] == 'peers':
  41. logging.debug('%d peers', len(message['peers']))
  42. for p_id, meta_info in message['peers'].items():
  43. if p_id == peer_id:
  44. continue
  45.  
  46. ping = {
  47. 'type': 'echo-request',
  48. 'res_id': meta_info['res_id'],
  49. 'peer_id': peer_id,
  50. 'data': os.urandom(8)
  51. }
  52. logging.debug('sending ping to %s', meta_info['addr'])
  53. self.sendto(ping, meta_info['addr'])
  54. else:
  55. logging.warn("received invalid message %s", message)
  56. else:
  57. logging.warn("receive invalid message %s", message)
  58.  
  59. def error_received(self, exc):
  60. logging.warn('error received: %s', exc)
  61.  
  62. def connection_lost(self, exc):
  63. logging.warn("socket closed, stop the event loop")
  64.  
  65. loop = asyncio.get_event_loop()
  66. addr = ('0.0.0.0', 0)
  67. listen = loop.create_datagram_endpoint(TrackerClientProtocol, local_addr=addr)
  68. transport, protocol = loop.run_until_complete(listen)
  69. logging.info("Started UDP client %s", str(transport.get_extra_info('socket')))
  70.  
  71.  
  72. tracker_addr = (sys.argv[1], int(sys.argv[2]))
  73.  
  74.  
  75. async def send_announce():
  76. while True:
  77. announce = {'type': 'announce', 'res_id': res_id, 'peer_id': peer_id}
  78. logging.info('sending announce %s', str(announce))
  79. transport.sendto(pickle.dumps(announce), tracker_addr)
  80. await asyncio.sleep(10)
  81.  
  82. asyncio.ensure_future(send_announce())
  83.  
  84. try:
  85. loop.run_forever()
  86. except KeyboardInterrupt:
  87. pass
  88.  
  89. transport.close()
  90. loop.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement