2016-04-29 12 views
0

Webサーバーのリストがソケットライブラリのあるポートでリッスンしているかどうかを確認しようとしています。しかし、私はリストを正常に実行するための反復を得ることができません:ソケットの接続機能に文字列のリストを反復できません

#!/usr/bin/python 

    import socket 

    myList = ['www.google.com', 'www.spoon.com'] 
    scanList = [] 
    port = 80 

    def resolveHost(x): 
     try: 
      h = socket.gethostbyname(x) 
     except: 
      pass 
     return h 

    def scan(host,port): 
     s = socket.socket() 
     s.connect(host,port) 
     print s.recv(3) 


    for x in myList: 
     scanList.append(resolveHost(x)) 

    print scanList 

    for x in scanList: 
     scan(x,25) 


This is returning: 

    Traceback (most recent call last): 
    ['216.58.199.196', '207.32.184.61'] 
     File "C:/Users/Casey/Desktop/projects/dsid_check.py", line 28, in <module> 
     scan(x,25) 
     File "C:/Users/Casey/Desktop/projects/dsid_check.py", line 18, in scan 
     s.connect(host,port) 
     File "C:\Python27\lib\socket.py", line 228, in meth 
     return getattr(self._sock,name)(*args) 
    TypeError: connect() takes exactly one argument (2 given) 

    Process finished with exit code 1 

私はこれらのページからの応答が期待されていますが、私はしません。

----------編集したソース------------

だから私は、次のような見て私のソースを変更した:

#!/usr/bin/python 

import socket 

myList = ['www.espn.com', 'www.google.com', 'www.spoon.com'] 

scanList = [] 
port = 80 

def resolveHost(x): 
    try: 
     h = socket.gethostbyname(x) 
     return h 
    except: 
     print "Could not resolve %s" % x 

def scan(host,port): 
    hostR = resolveHost(host) 
    s = socket.socket() 
    s.settimeout(3) 
    s.connect((hostR,port)) 
    try: 
     print s.recv(1024) 
    except: 
     print "Connection to %s timed out" % x 


for x in myList: 
    scanList.append(resolveHost(x)) 

for x in scanList: 
    scan(x,port) 

これで私はオンラインにすべきウェブサーバーのリストに接続することができません。 Alexのおすすめのライブラリリンクを読んでください。

+0

と仮定 'socket.gethostbyname'はあなたが無視する例外を発生させます。定義されていない場合、どのように 'h 'を返すことができますか?例外を発生させます。 –

+0

'scanList'を' myListのxに対してresolveHost(x) 'または' map(resolveHost、myList) 'として定義することもできます。 –

答えて

0

1つのタプルで2つの引数をペアとして渡す必要があります。

>>> import socket 
>>> s = socket.socket() 
>>> help(s.connect) 

connect(...) method of socket._socketobject instance 
    connect(address) 

    Connect the socket to a remote address. For IP sockets, the address 
    is a pair (host, port). 

>>> s.connect('127.0.0.1', 80) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/alexhall/.pyenv/versions/2.7.10/lib/python2.7/socket.py", line 228, in meth 
    return getattr(self._sock,name)(*args) 
TypeError: connect() takes exactly one argument (2 given) 
>>> s.connect(('127.0.0.1', 80)) # works 
+0

だから私は、.connect()が期待する入力が2つの入力を必要とすると仮定していました。したがって、タプルは1つの入力として扱われますか? –

+0

@CaseyMcCarthyそれは完全に無意味なデザインですが、その方法は、はいです。 –

+0

@CaseyMcCarthyちなみに、これは 's.recv(3)'が永遠にブロックされるため、とにかく動作しないようです。 HTTPでは、クライアントは適切な要求を送信することが予想され、サーバーは接続時にデータを出力しません。リクエストライブラリを試してみてください:http://docs.python-requests.org/ja/master/user/quickstart/ –

0

アレックスの推奨事項を参考にして、私が以前にしたかったことを拡張することができました。元のソースコードを改造したものの完全な例としてこれを見てください。

#!/usr/bin/python 

import socket, urllib2 

httpList = ['www.espn.com', 'www.google.com', 'www.spoon.com'] 
smtpList = ['smtp.gmail.com', 'aspmx.l.google.com'] 
scanHttp = [] 
scanSmtp = [] 

def resolveHost(x): 
    try: 
     h = socket.gethostbyname(x) 
     print "Resolved %s to %s" % (x, h) 
     return h 
    except: 
     print "Could not resolve %s" % x 

def scan(host,port): 
    hostR = socket.gethostbyname(host)#resolveHost(host) 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.settimeout(3) 
    s.connect((hostR,port)) 
    try: 
     if (port == 80): 
      r = urllib2.urlopen('http://'+str(host)).read() 
      if 'DOCTYPE' in r: 
       print "%s is up" % host 
      elif 'doctype' in r: 
       print "%s is up" % host 
     elif (port == 25): 
      r = s.recv(1024) 
      if '220' in r: 
       print "%s is up" % host 
    except: 
     print "Connection to %s timed out" % x 


for x in httpList: 
    scan(x,80) 

for x in smtpList: 
    scan(x,25) 

これはチェックの期待される結果は、二つのリストが選択したポートを介して到達可能である生成:

C:\Python27\python.exe C:/Users/Casey/Desktop/projects/service_check.py 
www.espn.com is up 
www.google.com is up 
www.spoon.com is up 
smtp.gmail.com is up 
aspmx.l.google.com is up 

Process finished with exit code 0 
+0

素晴らしい!タイムアウトを設定して以来、私はあなたが永遠にブロックすることによって何を意味するかを理解していると思います。小さな改善ができます:(1) 'resolveHost'が優れていますが、例外を隠す理由はまだありません。最後に 'raise'を追加すれば、何かが間違っていたら便利なトレースバックを見ることができるように、それはそのまま再現されます。 (2)条件の周りにPythonが必要ない場合は、 'if port == 80:'と書くだけです。 (3)あなたは '' http:// '+ str(host) 'と書いていますが、確かに' host'は文字列です。そうでない場合は、より大きな問題があり、これで解決できません。 –

+0

(4)rの 'DOCTYPE 'や' r:print ... 'の' doctype'を使って重複を減らしたい場合は、 'r.upper()'の 'DOCTYPE 'を' (5)これは実際には本当に重要です。良い、意味のある名前の習慣を身につけましょう。特に1文字の名前は避けてください。 'hostR'はどういう意味ですか?あなたはそれを説明する必要がないので、答えが何であるかは重要ではありません。それは明らかです。 (6)ポートが80でも25でもないなら、あなたは何をしたいですか?間違ったポートが入力された場合に問題を見つけるのが簡単になるように、メッセージを印刷するか例外を発生させることを検討してください。 –

+0

(7)できるだけ裸の 'except:'や 'Exception:'を除いて、広範な例外捕捉を避けてください。彼らはあなたがたぶん捕まえたくない多くのエラーをキャッチします。そのブロックに達すると、問題がタイムアウトであることは実際にはわかりません。 'socket.error:except 'のようなもっと具体的なものを考えてみましょう。また、トレースバックを見るために例外を再評価して、タイムアウトした場所を見ることができます。 (8) 'doctype'のテストはおそらく一般的ではありません。'gmail.com'で何が起こるのか見てみてください。おそらく状態コードが200と499の間であることを確認したいと思うでしょう。 –

関連する問題