编程新手,帮助我理解端口扫描

时间:2016-08-31 05:19:01

标签: python-3.x

下面是我编写的代码示例,它构成了我用Python编写的端口扫描程序的迭代部分。

sock = socket(AF_INET, SOCK_STREAM)
open_ports_list = []

for i in range(port_min, port_max + 1):
    ipaddress_tup = (ipaddress, i)
    status = sock.connect_ex(ipaddress_tup)

    #executed if connect_ex(ipaddress_tup) is successful 
    if status == 0:
        print('Port',i, 'is OPEN')
        open_ports_list.append(i)

    #executed if connect_ex(ipaddress_tup) is unsuccessful  
    else:
        print('Port',i,'is CLOSED')

扫描的系统有端口135和136 OPEN,但是当我运行上面的代码时,它说端口135是OPEN而端口136是CLOSED。

但是,如果我添加:

sock = socket(AF_INET, SOCK_STREAM)

像这样进入If块:

sock = socket(AF_INET, SOCK_STREAM)
open_ports_list = []

for i in range(port_min, port_max + 1):
    ipaddress_tup = (ipaddress, i)
    status = sock.connect_ex(ipaddress_tup)

    #executed if connect_ex(ipaddress_tup) is successful 
    if status == 0:
        print('Port',i, 'is OPEN')
        open_ports_list.append(i)
        sock = socket(AF_INET, SOCK_STREAM)

    #executed if connect_ex(ipaddress_tup) is unsuccessful  
    else:
        print('Port',i,'is CLOSED')

然后代码正确地将端口135和136标识为OPEN。

那么这里发生了什么?为什么在if块中重新定义袜子可以解决问题?我是否可以获得正确的端口状态结果,而无需在每次找到开放端口时重新定义袜子?

我已经从朋友那里得到提示,可以使用detach()函数代替,但我不知道它的作用或使用方法。

非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:1)

在我所知道的操作系统上,您只能成功连接一次插座。

您必须创建一个新套接字。