下面是我编写的代码示例,它构成了我用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()函数代替,但我不知道它的作用或使用方法。
非常感谢任何和所有帮助。
答案 0 :(得分:1)
在我所知道的操作系统上,您只能成功连接一次插座。
您必须创建一个新套接字。