Rubin TCPSocket recv Blockier- und nie Rückkehr
-
24-09-2019 - |
Frage
Also, ich habe den folgenden Code:
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
Ende
Welche ganz gut, normal funktioniert. Der Server Ich rede mit gibt die Antwort ziemlich schnell, in der Regel, und alles ist gut.
Dann heute, ging etwas mit dem Server falsch. Nicht mein Problem, sondern führte dies in meiner gesamten Anwendung hängen, wartet auf recv zu Zeit. Dies ist nicht gerade optimal.
Gibt es einen Ausweg recv zu Zeit, wenn ich ‚hört etwas zurück sofort nicht? Ich habe versucht, in der Ruby-Dokumentation suchen, aber es verwirrt mich wirklich (dh TCPSocket nur Arbeitsgeräte drei Methoden, keiner von ihnen öffnen oder recv, und es übergeordnete Klasse von Sockel dieser Methoden nicht implemente auch nicht. Und Sockel der Elternklasse erscheint Objekt zu sein ? ich bin throughly verwirrt)
Lösung
Sie kann die Timeout-Socket-Optionen auf dem Sockel auf etwas anderes als der Standard erhalten. Der schwierige Bit ist eine geeignete Anzahl zu wählen, dass nach wie vor in allen Anwendungsfällen funktioniert, das heißt Sie wollen nicht zu früh Ihre recv
Aufruf Timeout.
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)