Rubino TCPSocket recv di blocco e non tornare mai più
-
24-09-2019 - |
Domanda
Così, ho il seguente codice:
def LSCPHandler.send_message(message, hostname, port)
s = TCPSocket.open(hostname, port)
s.print message
ret = s.recv(1024)
s.close
LSCPHandler.parse_error(ret)
return ret
end
Il che funziona bene, normalmente. Il server Sto parlando con restituisce la risposta abbastanza rapidamente, in genere, e tutto va bene.
Poi, oggi, qualcosa è andato storto con il server. Non è il mio problema, ma, ciò ha determinato in tutta la mia impiccagione applicazione, in attesa di recv per timeout. Questo non è esattamente ottimale.
C'è un modo per time out recv se io non' sentire qualcosa di nuovo subito? Ho provato a guardare la documentazione di rubino, ma in realtà mi confonde (cioè TCPSocket solo implementa tre metodi, nessuno di loro si aprono o recv, ed è di classe genitrice di Socket non implemente questi metodi sia. Classe padre di E Socket sembra essere oggetto ? sto accuratamente confuso)
Soluzione
È possibile impostare la ricezione di timeout opzioni di socket sulla presa a qualcos'altro da quello predefinito. La parte difficile è quello di scegliere un numero adeguato che funziona ancora in tutti i casi d'uso, vale a dire non volete la chiamata recv
al timeout troppo presto.
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)