Python socket connect在 for循环中

2024-10-01 11:23:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python编写一个程序,它的一部分是扫描网站上的活动端口。在scanports模块中,如果我说scanports 79到81,我知道它应该返回一个包含80的列表。我知道这一点是肯定的,因为当我运行scanport时,它显示端口80已启动。很抱歉没有任何评论:

import subprocess, socket, urllib2, sys
class pymap:
    def __init__(self):
        pass

################################################################################
################################################################################

    def host(self, host):
        self.host = host
        socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock = socket1

################################################################################
################################################################################

    def getip(self):
        if self.host == None:
            print "Specify a host first."
        else:
            return socket.gethostbyname(self.host)

################################################################################
################################################################################

    def scanports(self, start, end):
        ports = []
        self.sock.settimeout(0.000001)
        for i in xrange(start, end+1):  #49151
            try:
                self.sock.connect((self.host, i))
                ports.append(i)
            except:
                pass
        return i

################################################################################
################################################################################

    def scanport(self, port1):
        self.sock.settimeout(0.000001)
        try:
            self.sock.connect((self.host, port1))
            return 1
        except:
            return 0

################################################################################
################################################################################

    def traceroute(self):
        if self.host == None:
            print "Specify a host first."

        else:
            proc=subprocess.Popen(('tracert', self.host), shell=True, stdout=subprocess.PIPE)
            output=proc.communicate()[0]
            return output

################################################################################
################################################################################

    def getsource(self, url):
        page = urllib2.urlopen(url)
        return page.read()

################################################################################
################################################################################

x = pymap()
x.host("www.google.com")
print x.scanports(70, 85)
print x.scanport(80)

编辑: 我修改了它,感谢jameshenstridge指出我使用的是迭代变量,否则会更困难。但是,它仍然不起作用:

^{pr2}$

编辑:我想出来了,这是个问题端口.append,谢谢你的帮助。在


Tags: 端口selfhostreturndefpasssocketurllib2
1条回答
网友
1楼 · 发布于 2024-10-01 11:23:27

您的代码存在一些问题:

  1. 您的scanports方法返回循环迭代变量,因此无论它检测到什么端口,它都将始终返回end。也许您想返回ports列表?

  2. 你在重复使用同一个套接字。从connect系统调用手册页:

    Generally, connection-based protocol sockets may successfully connect() only once

    因此,如果要测试多个连接尝试,请每次创建一个新的套接字。使用后也应关闭这些插座。

相关问题 更多 >