repo is here. There is a multi-threaded version as well as the multi-process version shown below.
#! /usr/bin/python3 import socket from multiprocessing import Process # Scan all ports on target or localhost. # If scanning on localhost, local listeners # will be found as well (ex: 127.0.0.1:631 for CUPS). # However if scanning another host on your # network, only open ports set to :::xx will # be picked up (ex: :::22 for ssh). # 8 threads are used. def delimiter(): delim = '' for i in range(60): delim += '-' return delim + '\n' def try_ports(begin, end): print("starting scan of range: " + str(begin) + "-" + str(end)) target_ip = '127.0.0.1' # target_ip = '192.168.0.2' get = "GET / HTTP/1.1\r\nHost: " + target_ip + "\r\n\r\n" for port in range(begin, end): try: s = socket.create_connection((target_ip, port)) except Exception as e: continue s.sendall(get.encode()) response = s.recv(1024) try: service = socket.getservbyport(port) except Exception as e: service = "unknown service name" s.close() print("\n%-15s\t%-8d\n%s\n" % (service, port, response.decode())) print(delimiter()) if __name__ == '__main__': processes = [] port_ranges = { "1": (0, 8192), "2": (8192, 16384), "3": (16384, 24576), "4": (24576, 32768), "5": (32768, 40960), "6": (40960, 49152), "7": (49152, 57344), "8": (57344, 65536) } for process, ranges in port_ranges.items(): p = Process(target=try_ports, args=(ranges[0], ranges[1])) p.start() processes.append(p) for p in processes: p.join()