/examples/port_scanner/port_scanner.py

https://github.com/socketry/async-await · Python · 36 lines · 27 code · 7 blank · 2 comment · 5 complexity · 76d9aa03170ccbc06652fd28f3cc05e7 MD5 · raw file

  1. #!/usr/bin/env python
  2. import os, resource
  3. import asyncio
  4. class PortScanner:
  5. def __init__(self, host="0.0.0.0", ports=range(1, 1024+1), batch_size=1024):
  6. self.host = host
  7. self.ports = ports
  8. self.semaphore = asyncio.Semaphore(value=batch_size)
  9. self.loop = asyncio.get_event_loop()
  10. async def scan_port(self, port, timeout):
  11. async with self.semaphore:
  12. try:
  13. future = asyncio.open_connection(self.host, port, loop=self.loop)
  14. reader, writer = await asyncio.wait_for(future, timeout=timeout)
  15. print("{} open".format(port))
  16. writer.close()
  17. except ConnectionRefusedError:
  18. pass
  19. # print("{} closed".format(port))
  20. except asyncio.TimeoutError:
  21. print("{} timeout".format(port))
  22. def start(self, timeout=1.0):
  23. self.loop.run_until_complete(asyncio.gather(
  24. *[self.scan_port(port, timeout) for port in self.ports]
  25. ))
  26. limits = resource.getrlimit(resource.RLIMIT_NOFILE)
  27. batch_size = min(512, limits[0])
  28. scanner = PortScanner(host="127.0.0.1", ports=range(1, 65535+1), batch_size=batch_size)
  29. scanner.start()