2017-01-21 9 views
0

私はサーバーの情報を取得するプログラムを書いています。ただし、割り当て前にlengが参照されています。どうすればこれを防ぐことができますか?Python変数エラー - 代入前の参照

プログラムは最初に開いているポートをスキャンします。次に、見つかった最初のオープンポートに接続します。その後、サーバーに関する情報を取得します。プログラムはプログラムの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("")  
+1

また、完全なエラーメッセージを投稿したときにも役立ちます。 –

答えて

1

このコードには多くの問題があります。 が実行されている特定のものは、ローカルで参照されるグローバル変数の使用です。 一般的なルールとして、 のどこかで変更される可能性のあるグローバルデータを持つ代わりに、関数 の間でデータを明示的に渡す方が良いです。

とにかく...コードをそのまま見ると、グローバル変数 lenglengthが定義され、先頭に初期化されています。 実行順序で、ports_open()は の値をlengに変更しようとします。成功しない場合、関数get_ban() は、lengthの値を変更しようとします。

Pythonがこれらの割り当てを見ると(私が擬人化することが許可されている場合)、これは失敗します。「Aha!新しいローカルの変数は です。現在の値が使用されており、 には値がありません。エラー!

ローカル変数である ではなく、グローバル変数を使用していることをPythonに明示的に伝える必要があります。これは、グローバルを使用する前に、 このような行を挿入することで行われます

global leng 

global length 

はそれを実行し、そしてこのエラーは消えます。他にもエラーがありますが、 自分で修正しようとすると、それ以上のことが分かります。

関連する問題