LINUX.ORG.RU

Сканирование портов - проблема с открытием и закрытием сокета


0

0

Пытался написать портсканер: в цикле от начального порта до конечного создаю сокет, проверяю его на правильность, пытаюсь оединиться, закрываю(shutdown(sock,2)) сокет. И при закрытие сокета прога мне говорит, что не может его закрыть, смотрю в errno - там сказано, мол, нет коннекта, т.е. получается, что я могу закрыть сокет, только если у меня удалась ф-ция connect. А я беру диапазон портов 1-10000, и из-за того, что из них открыты только два порта, то значит у меня незакрытыми должны остаться 9998 сокетов, но мой комп столько не выдерживает, разрешает проге иметь открытыми максимум 1020 сокетов. Замкнутый круг, как быть? Если ктонить смог написать элементарный портсканер(исходники nmap'а разбирать с моими знаниями ..., вообщем элементарный - это в 1-2 экрана кода), заделитесь пожалуста.

anonymous

Ответ на: комментарий от anonymous

епрст
shutdown он разрывает соединение а не закрывает сокет
закрыть сокет close
shutdown вобще в линухе не надо
система разрывает соединение после close
а у тебя вобще разрывать нечего если конект не прошел
------
в nmap там с RAW сокетами работа идет и все намного хитрее
его в твоем случае безполезно смотреть.....

anonymous
()
Ответ на: комментарий от anonymous

import socket as sk import sys import threading

MAX_THREADS = 50

def usage(): print "\npyScan 0.1" print "usage: pyScan <host> [start port] [end port]" class Scanner(threading.Thread): def __init__(self, host, port): threading.Thread.__init__(self) # host and port self.host = host self.port = port # build up the socket obj self.sd = sk.socket(sk.AF_INET, sk.SOCK_STREAM)

def run(self): try: # connect to the given host:port self.sd.connect((self.host, self.port)) print "%s:%d OPEN" % (self.host, self.port) self.sd.close() except: pass

class pyScan: def __init__(self, args=[]): # arguments vector self.args = args # start port and end port self.start, self.stop = 1, 1024 # host name self.host = ""

# check the arguments if len(self.args) == 4: self.host = self.args[1] try: self.start = int(self.args[2]) self.stop = int(self.args[3]) except ValueError: usage() return if self.start > self.stop: usage() return elif len(self.args) == 2: self.host = self.args[1] else: usage() return

try: sk.gethostbyname(self.host) except: print "hostname '%s' unknown" % self.host self.scan(self.host, self.start, self.stop)

def scan(self, host, start, stop): self.port = start while self.port <= stop: while threading.activeCount() < MAX_THREADS: Scanner(host, self.port).start() self.port += 1 if __name__ == "__main__": pyScan(sys.argv)

stiner_rd
()
Ответ на: комментарий от stiner_rd

import socket as sk
import sys
import threading

MAX_THREADS = 50

def usage():
    print "\npyScan 0.1"
    print "usage: pyScan <host> [start port] [end port]"
    
class Scanner(threading.Thread):
    def __init__(self, host, port):
        threading.Thread.__init__(self)
        # host and port
        self.host = host
        self.port = port
        # build up the socket obj
        self.sd = sk.socket(sk.AF_INET, sk.SOCK_STREAM)

    def run(self):
        try:
            # connect to the given host:port
            self.sd.connect((self.host, self.port))
            print "%s:%d OPEN" % (self.host, self.port)
            self.sd.close()
        except: pass

class pyScan:
    def __init__(self, args=[]):
        # arguments vector
        self.args = args
        # start port and end port
        self.start, self.stop = 1, 1024
        # host name
        self.host = ""

        # check the arguments
        if len(self.args) == 4:
            self.host = self.args[1]
            try:
                self.start = int(self.args[2])
                self.stop = int(self.args[3])
            except ValueError:
                usage()
                return
            if self.start > self.stop:
                usage()
                return
        elif len(self.args) == 2:
            self.host = self.args[1]
        else:
            usage()
            return

        try:
            sk.gethostbyname(self.host)
        except:
            print "hostname '%s' unknown" % self.host
        self.scan(self.host, self.start, self.stop)

    def scan(self, host, start, stop):
        self.port = start
        while self.port <= stop:
            while threading.activeCount() < MAX_THREADS:
                Scanner(host, self.port).start()
                self.port += 1
        
if __name__ == "__main__":
    pyScan(sys.argv)

stiner_rd
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.