Этот вопрос не ограничивается Python. Его общий вопрос сокета. У меня есть неблокирующий сокет и вы хотите подключиться к машине, доступной - с другой стороны порт не существует. Почему выбор (...) в любом случае преуспевает? Я ожидал таймаута. sock.send (...) терпит неудачу со сломанной трубой. Как определить, действительно ли сокет действительно подключен после выбора (...)? Спасибо заранее.Неблокируемое соединение
import socket, errno, os, time, select
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(0)
err = sock.connect_ex(('192.168.178.21', 12345))
ready_to_read, ready_to_write, in_error = select.select([], [sock], [], timeout=5)
#ready_to_write is set even 192.168.178.21:12345 does not exist.
sock.setblocking(1)
sock.send('foo') #this fails
sock.close()
sock.getsockopt (socket.SOL_SOCKET, socket.SO_ERROR) сделал трюк для меня. – HelloWorld
ОК. имейте в виду, что сокет может быть отключен между 'getsockopt()' return и вашей попыткой прочитать или записать в сокет. поэтому вы все равно должны пытаться обрабатывать ошибки в send/recv изящно. – mpontillo