29

この質問は次のように展開されます: Python でソケットを開く最良の方法 ソケットを開く
ときに、ソケットが確立されているかどうか、タイムアウトしていないか、通常は失敗しているかどうかをテストするにはどうすればよいですか。

編集:私はこれを試しました:

try:
    s.connect((address, '80'))
except:
    alert('failed' + address, 'down')

ただし、その接続が機能しているはずの場合でも、アラート関数が呼び出されます。

4

4 に答える 4

43

そこにキャッチしたい例外をキャッチしていないようです:)

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それらのそれぞれについて個別のステートメントを作成できます。問題。

于 2008-10-07T06:46:53.403 に答える
6

あなたは本当に投稿する必要があります:

  1. あなたの例の完全なソースコード
  2. 要約ではなく、実際の結果

動作する私のコードは次のとおりです。

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')
于 2008-10-07T08:48:00.850 に答える