In Python möchte ich socket.connect()
auf einem Socket verwenden, die ich auf nicht blockierend festgelegt habe. Wenn ich das versuche, wirft die Methode immer eine BlockingIOError
. Wenn ich den Fehler ignoriere (wie unten), wird das Programm wie erwartet ausgeführt. Wenn ich den Socket nach der Verbindung auf nicht blockierend eingestellt habe, sind keine Fehler aufgetreten. Wenn ich Select.select() verwende, um sicherzustellen, dass der Socket lesbar oder schreibbar ist, erhalte ich immer noch den Fehler.Wie verbinde ich() mit einem nicht blockierenden Sockel?
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()
Terminal 1
$ python testserver.py
--> From the client
Terminal 2
$ python testclient.py
BlockingIOError
sent '--> From the client\n' successfully.
Dieser Code funktioniert einwandfrei mit Ausnahme der BlockingIOError auf der ersten Verbindung(). Die Dokumentation für den Fehler liest sich so: Raised when an operation would block on an object (e.g. socket) set for non-blocking operation.
Wie kann ich richtig() mit einem nicht blockierten Sockel verbinden? Kann ich connect() non-blocking machen? Oder ist es angemessen, den Fehler einfach zu ignorieren?
Dieser Link könnte Ihnen helfen: http://stackoverflow.com/questions/1205863/how-can-i-get-non-blocking-socket-connects – akash12300
@ Akash1993 yeah, als ich diese Frage zuvor ich schaute hatte es schwer, es mit meinem einfachen Beispiel zu verbinden. Ich möchte asyncio vermeiden; es scheint übertrieben. Es wird klargestellt, dass der Fehler ausgelöst wird, da Blöcke zusammen mit der blockingioerror-Dokumentation nicht verbunden werden. Die Frage ist mehr "gibt es eine Möglichkeit, connect() non-blocking" zu machen. – MikeJava