Ganapathi
Ganapathi

Reputation: 11

i am trying to develop a port scanner in python but my code is not giving any open port give me some suggestions about that?

This is my code it's just starting the scan but it is not completing ,where is the error in it. i need output as port number and port side by side.when i run in command prompt it gives like that,please give suggetions on that

from socket import *
import sys,time
from datetime import datetime

host =''
max_port=100
min_port=1

def scan_host(host,port,r_code=1):
    try:
        s=socket(AF_INET,SOCK_STREAM)
        code=s.connect_ex((host,port))
        if code==0:
            r_code=code
        s.close()
    except Exception,e:
        pass
    return r_code

try:
    host=raw_input("Enter Host address:")
except  KeyboardInterrupt:
    print("\n Application shtdown")
    sys.exit(1)

hostip=gethostbyname(host)
print("\n Host:%s IP:%s" %(host,hostip))
print("Scanning Started At %s...\n" %(time.strftime("%H:%M:%S")))
start_time=datetime.now()


for port in range(min_port,max_port):
    try:
        response=scan_host(host,port)

        if response ==0:
            print("Port %d: Open" %(port))
    except Exception,e:
        pass
stop_time=datetime.now()
total_time_duration=stop_time -start_time
print("\n Scanning Finished At %s ..." % (time.strftime("%H:%M:%S")))
print("Scanning Duration:%s..." %(total_time_duration))
print("Have a nice day ...Sergeant Exploiter (Sploit)")

Upvotes: 1

Views: 566

Answers (1)

Noctis Skytower
Noctis Skytower

Reputation: 21991

Before using the following port scanner, you may want to check a few things first:

  • Is the firewall on your computer blocking the port scanner?
  • Is the device your computer connected to blocking certain ports?
  • Is the computer you are trying to scan blocking ports with its firewall?
  • Do you know the correct name of the host that you are trying to scan?
  • Can you create a server on one computer and connect to it with a client on the other?

If none of the above points are cause for your problem, the program shown below may work for you:

#! /usr/bin/env python3
import argparse
import collections
import itertools
import multiprocessing
import operator
import socket

PURPOSE = 'Scan for open ports on a computer.'
PORTS = range(1 << 16)
POOL_SIZE = 1 << 8
TIMEOUT = 0.01


def main():
    """Get computer to scan, connect with process pool, and show open ports."""
    parser = argparse.ArgumentParser(description=PURPOSE)
    parser.add_argument('host', type=str, help='computer you want to scan')
    host = parser.parse_args().host
    with multiprocessing.Pool(POOL_SIZE, socket.setdefaulttimeout, [TIMEOUT]) \
            as pool:
        results = pool.imap_unordered(test, ((host, port) for port in PORTS))
        servers = filter(operator.itemgetter(0), results)
        numbers = map(operator.itemgetter(1), servers)
        ordered = sorted(numbers)
    print(f'Ports open on {host}:', *format_ports(ordered), sep='\n    ')


field_names = 'family', 'socket_type', 'protocol', 'canon_name', 'address'
AddressInfo = collections.namedtuple('AddressInfo', field_names)
del field_names


def test(address):
    """Try connecting to the server and return whether or not it succeeded."""
    host, port = address
    for info in itertools.starmap(AddressInfo, socket.getaddrinfo(host, port)):
        try:
            probe = socket.socket(info.family, info.socket_type, info.protocol)
        except OSError:
            pass
        else:
            try:
                probe.connect(info.address)
            except OSError:
                pass
            else:
                probe.shutdown(socket.SHUT_RDWR)
                return True, port
            finally:
                probe.close()
    return False, port


def format_ports(ports):
    """Convert port numbers into strings and show all associated services."""
    if ports:
        for port in ports:
            try:
                service = socket.getservbyport(port)
            except OSError:
                service = '?'
            yield f'{port:<5} = {service}'
    else:
        yield 'None'


if __name__ == '__main__':
    main()

Upvotes: 1

Related Questions