Python'da, engellemeyi engellemediğim bir yuvada socket.connect()
kullanmak istiyorum. Bunu yapmaya çalıştığımda, yöntem her zaman bir BlockingIOError
atar. Hatayı görmezden geldiğimde (aşağıdaki gibi) program beklendiği gibi yürütülür. Soketi bağlandıktan sonra engellemeyi engellediğinde, hata yoktur. Soketin okunabilir veya yazılabilir olduğundan emin olmak için select.select() öğesini kullandığımda hala hatayı alıyorum.Bloke olmayan bir soket ile bağlantı nasıl yapılır?
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()
terminali 1
$ python testserver.py
--> From the client
terminali 2
$ python testclient.py
BlockingIOError
sent '--> From the client\n' successfully.
Bu kod ilk bağlantı üzerinde BlockingIOError() hariç doğru çalışır. Hata belgelerine şu şekilde okunur: Raised when an operation would block on an object (e.g. socket) set for non-blocking operation.
Bloke etmek için bir soket seti ile doğru şekilde() nasıl bağlarım? Connect() 'i bloke etmeden yapabilir miyim? Ya da hatayı görmezden gelmek uygun mu?
Bu bağlantı size yardımcı olabilir: http://stackoverflow.com/questions/1205863/how-can-i-get-non-blocking-socket-connects – akash12300
@ Akash1993 evet, daha önce bu soruya baktığımda basit örneğimle ilgili zor bir zaman geçirdim. Asyncio'dan kaçınmak istiyorum; Fazlalık görünüyor. Hata oluştuğunu açıklığa kavuşturur çünkü bloke etmemesi gerektiğinde (blockingioerror dokümantasyonu ile birlikte). Soru daha 'connect()' non-blocking 'yapmak için bir yol var. – MikeJava