Questa domanda non è limitata a Python. È una domanda generica sul socket. Ho un socket non bloccante e voglio collegarmi a una macchina che è raggiungibile - dall'altra parte la porta non esiste. Perché selezionare (...) avere successo comunque? Mi aspettavo un timeout. sock.send (...) fallisce con un tubo rotto. Come posso determinare se il socket è realmente connesso dopo aver selezionato (...)? Grazie in anticipo.Connessione non bloccante
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) ha fatto il trucco per me. – HelloWorld
ok. tieni presente che il socket può essere spento tra il ritorno di 'getsockopt()' e il tuo tentativo di leggere o scrivere sul socket. quindi dovresti ancora provare a gestire gli errori su send/recv con garbo. – mpontillo