我编写了一个获取服务器信息的程序。但是,程序说在分配之前引用了leng
。我该如何防止这种情况?
程序首先扫描开放端口。然后它连接到它找到的第一个开放端口。然后它获取有关服务器的信息。然后程序获取程序的IP地址,最后关闭连接。
import socket
VER = None
portlist = [21,22,25,80,110,443]
ports_test = [21,22,25,80,110,443]
length = 0
leng = 0
siteORip = input("input either a site <eg:www.anysite.com> or an ip address<eg:123.45.67.890>>")
def get_ban():
print("[CONNECTING>]Establishing connection...")
while True:
try:
port = portlist.pop(0)
s = socket.socket()
socket.setdefaulttimeout(5)
s.connect((siteORip,port))
s.send("x".encode())
data = s.recv(1024)
print("[SERVER BANNER>]",data)
break
except:
s.close()
length = length + 1
if length == 6:
print("[ERROR>]Failed to connect")
break
else:
continue
def get_info():
try:
info = socket.gethostbyaddr(siteORip)
print("[SERVER INFO:([HOST,ADDITIONAL HOST,IP ADDRESS])>]",info)
except:
print("[ERROR>]Unknown error retrieving server info")
def get_ip():
try:
IP = socket.gethostbyname(siteORip)
except:
IP = socket.gethostbyname(siteORip)
try:
print("[IP ADDRESS>]",IP)
except:
print("[ERROR>]Unable to access IP")
VER = 1
s.close()
def ports_open():
while True:
try:
for x in ports_test:
s = socket.socket()
socket.setdefaulttimeout(5)
s.connect((siteORip,x))
print("[TESTING...>]Port",x,"is open")
s.close()
except:
print("[TESTING...>]Port",x,"is closed")
s.close()
leng = leng + 1
if leng == 6:
break
else:
continue
def main():
ports_open()
get_ban()
get_info()
get_ip()
print("[<PROGRAM CONNECTION ENDED>]")
main()
wait = input("")
答案 0 :(得分:1)
嗯,这段代码有很多问题。具体你是谁 遇到的是使用本地引用的全局变量。如 一般来说,最好在函数之间传递数据 明确地,而不是具有可能被更改的全局数据 任何地方。
无论如何......按原样查看代码,你有全局变量
leng
和length
在顶部定义并初始化。接受它
执行顺序,函数ports_open()
尝试更改值
leng
。它不会成功,但如果确实如此,那么函数get_ban()
然后会尝试更改length
。
这失败了,因为(如果我可以被允许拟人化)的时候 Python看到了这些任务,它认为“啊哈!一个新的本地变量是 被分配!哎呀,但它正在使用它的当前值 没有。错误!”
我们需要明确地告诉Python我们没有使用局部变量, 而是全局变量。这是通过插入像这样的行来完成的 在使用全球之前:
global leng
global length
这样做,这个错误就会消失。还有其他错误,但请 试着自己解决这些问题,你会以这种方式学习。