web-dev-qa-db-ja.com

Pythonでのソケット接続のテスト

この質問は次のように展開されます。 Pythonでソケットを開く最良の方法


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

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

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

22
UnkwnTech

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

ssocket.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ステートメントを作成することができます-この方法で異なる種類の問題に対して異なる反応を示します。

37
kender

関数 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!"
8
ssoto

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

  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')
5
bortzmeyer