ソケット非ブロッキング状態の connect で EINPROGRESS(115) エラー
非ブロッキングモードのソケットでconnectすると、接続がすぐに確立されない時はconnect関数はエラーコードEINPROGRESS(115)を返します。これは接続処理が進行中であることを意味します。
非同期モードでは、connect 関数は接続完了まで待機せず、即座にリターンしてプログラムが他のタスクを実行し続けることを可能にします。これにより、プログラムが接続操作でブロックされることを回避し、プログラムの並列処理性能が向上します。
select や poll など関数を使って接続ソケット上での書き込み可能イベントを検出し、それが完了したことを確認できます。接続が正常に確立されるとソケットは書き込み可能となり、getsockopt 関数を呼び出して SO_ERROR オプションを渡すことで、ソケットのエラーを取得できます。
非同期モードでの接続操作を処理するサンプルコード例は次のとおりです。
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(False)
try:
sock.connect((‘example.com’, 80))
except socket.error as e:
if e.errno == socket.errno.EINPROGRESS:
# 连接正在进行中,需要使用 select 或 poll 来等待连接完成
pass
else:
# 其他错误处理
print(“Connect error:”, e)
このサンプルはあくまで参考であり、具体的な運用シーンに合わせて編集・拡張することを推奨します。