この質問は次のように展開されます。 Pythonでソケットを開く最良の方法
。
編集:私はこれを試しました:
try:
s.connect((address, '80'))
except:
alert('failed' + address, 'down')
ただし、その接続が機能するはずだった場合でも、アラート機能が呼び出されます。
あなたはそこにキャッチしたい例外をキャッチしていないようです:)
s
がsocket.socket()
オブジェクトである場合、.connect
を呼び出す正しい方法は次のようになります。
import socket
s = socket.socket()
address = '127.0.0.1'
port = 80 # port number is a number, not string
try:
s.connect((address, port))
# originally, it was
# except Exception, e:
# but this syntax is not supported anymore.
except Exception as e:
print("something's wrong with %s:%d. Exception is %s" % (address, port, e))
finally:
s.close()
Try-exceptループでキャッチしている例外がどんな種類かを常に確認してください。
ソケットモジュール内のどのタイプの例外がどの種類のエラー(タイムアウト、アドレスを解決できないなど)を表しているかを確認し、それぞれに対して個別のexcept
ステートメントを作成することができます-この方法で異なる種類の問題に対して異なる反応を示します。
関数 connect_ex を使用できます。例外をスローしません。その代わりに、Cスタイルの整数値(Cでは errno と呼ばれる)を返します。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex((Host, port))
s.close()
if result:
print "problem with socket!"
else:
print "everything it's ok!"
あなたは本当に投稿する必要があります:
ここに私のコードがあります、それは動作します:
import socket, sys
def alert(msg):
print >>sys.stderr, msg
sys.exit(1)
(family, socktype, proto, garbage, address) = \
socket.getaddrinfo("::1", "http")[0] # Use only the first Tuple
s = socket.socket(family, socktype, proto)
try:
s.connect(address)
except Exception, e:
alert("Something's wrong with %s. Exception type is %s" % (address, e))
サーバーがリッスンするとき、何も得られません(これは正常です)。
Something's wrong with ('::1', 80, 0, 0). Exception type is (111, 'Connection refused')