Pythonでは、私はnon-blockingに設定したソケットにsocket.connect()
を使用したいと思います。これを実行しようとすると、メソッドは常にBlockingIOError
をスローします。エラー(後述)を無視すると、プログラムは期待通りに実行されます。接続後にソケットを非ブロッキングに設定すると、エラーは発生しません。 select.select()を使用してソケットが読み書き可能であることを確認すると、エラーが発生します。非ブロックソケットとの接続()
testserver.py
import socket
import select
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(0)
host = socket.gethostname()
port = 1234
sock.bind((host, port))
sock.listen(5)
while True:
select.select([sock], [], [])
con, addr = sock.accept()
message = con.recv(1024).decode('UTF-8')
print(message)
testclient.py
import socket
import select
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(0)
host = socket.gethostname()
port = 1234
try:
sock.connect((host, port))
except BlockingIOError as e:
print("BlockingIOError")
msg = "--> From the client\n"
select.select([], [sock], [])
if sock.send(bytes(msg, 'UTF-8')) == len(msg):
print("sent ", repr(msg), " successfully.")
sock.close()
端末1
$ python testserver.py
--> From the client
端末2
$ python testclient.py
BlockingIOError
sent '--> From the client\n' successfully.
このコードは、最初の接続にBlockingIOError()を除いて正常に動作します。エラーのドキュメントは次のようになります。Raised when an operation would block on an object (e.g. socket) set for non-blocking operation.
ノンブロッキングに設定されたソケットに正しく接続するにはどうしたらいいですか?私はconnect()non-blockingを作ることができますか?または、エラーを無視するのが適切ですか?ここ
このリンクはあなたに役立つかもしれません: http://stackoverflow.com/questions/1205863/how-can-i-get-non-blocking-socket-connects – akash12300
@ Akash1993ええ、以前私はその質問を見ました。それを私の簡単な例に関連付けるのは苦労しました。私はasyncioを避けたいです。それは過度のようだ。それは、ブロックするべきではないときにブロックを接続するためにエラーがスローされることを明確にしています(blockingioerrorドキュメントとともに)。問題は、 'connect()non-blocking'を作る方法があるということです。 – MikeJava