Advertisement
Guest User

Untitled

a guest
Aug 30th, 2015
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. #!/usr/bin/env python3.5
  2. import socket
  3. import asyncio
  4. from struct import pack, unpack
  5.  
  6.  
  7. class Client(asyncio.Protocol):
  8. def connection_made(self, transport):
  9. self.transport = transport
  10. self.server_transport = None
  11.  
  12. def data_received(self, data):
  13. # print('recv:', repr(data))
  14. self.server_transport.write(data)
  15.  
  16. def connection_lost(self, *args):
  17. self.server_transport.close()
  18.  
  19.  
  20. class Server(asyncio.Protocol):
  21. INIT, HOST, DATA = 0, 1, 2
  22.  
  23. def connection_made(self, transport):
  24. print('from:', transport.get_extra_info('peername'))
  25. self.transport = transport
  26. self.state = self.INIT
  27.  
  28. def connection_lost(self, exc):
  29. self.transport.close()
  30.  
  31. def data_received(self, data):
  32. # print('send:', repr(data))
  33.  
  34. if self.state == self.INIT:
  35. assert data[0] == 0x05
  36. self.transport.write(pack('!BB', 0x05, 0x00)) # no auth
  37. self.state = self.HOST
  38.  
  39. elif self.state == self.HOST:
  40. ver, cmd, rsv, atype = data[:4]
  41. assert ver == 0x05 and cmd == 0x01
  42.  
  43. if atype == 3: # domain
  44. length = data[4]
  45. hostname = data[5:5+length]
  46. nxt = 5 + length
  47. elif atype == 1: # ipv4
  48. hostname, nxt = socket.inet_ntop(socket.AF_INET, data[4:8]), 8
  49. elif atype == 4: # ipv6
  50. hostname, nxt = socket.inet_ntop(socket.AF_INET6, data[4:20]), 20
  51. port = unpack('!H', data[nxt:nxt+2])[0]
  52.  
  53. print('to:', hostname, port)
  54. asyncio.ensure_future(self.connect(hostname, port))
  55. self.state = self.DATA
  56.  
  57. elif self.state == self.DATA:
  58. self.client_transport.write(data)
  59.  
  60. async def connect(self, hostname, port):
  61. loop = asyncio.get_event_loop()
  62. transport, client = \
  63. await loop.create_connection(Client, hostname, port)
  64. client.server_transport = self.transport
  65. self.client_transport = transport
  66. hostip, port = transport.get_extra_info('sockname')
  67. host = unpack("!I", socket.inet_aton(hostip))[0]
  68. self.transport.write(
  69. pack('!BBBBIH', 0x05, 0x00, 0x00, 0x01, host, port))
  70.  
  71. if __name__ == '__main__':
  72. loop = asyncio.get_event_loop()
  73. srv = loop.create_server(Server, 'localhost', 8000)
  74. loop.run_until_complete(srv)
  75. loop.run_forever()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement