В Python я хотел бы использовать 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() неблокирующим? Или уместно просто игнорировать ошибку?
Эта ссылка может помочь вам: http://stackoverflow.com/questions/1205863/how-can-i-get-non-blocking-socket-connects – akash12300
@ Akash1993 Да, когда я рассматривал этот вопрос ранее, я было трудно связать его с моим простым примером. Я бы хотел избежать асинчо; это кажется излишним. Он разъясняет, что ошибка возникает из-за того, что блокирует блоки, когда она не должна (вместе с документацией blockingioerror). Вопрос в том, что «есть ли способ сделать connect() неблокирующим». – MikeJava