Ruby TCPSocket blocage recv et ne jamais revenir
-
24-09-2019 - |
Question
Alors, je le code suivant:
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
Ce qui fonctionne très bien, normalement. Le serveur que je parle renvoie la réponse assez rapidement, en général, et tout va bien.
Alors, aujourd'hui, quelque chose a mal tourné avec le serveur. Pas mon problème, mais, cela a donné lieu à toute ma suspension de l'application, en attendant récept temps. Ce n'est pas exactement optimale.
Est-il possible de temporiser les recv si je ne » entends quelque chose immédiatement? J'ai essayé regardant la documentation de rubis, mais il me confond vraiment (c.-à-TCPSocket implémente seulement trois méthodes, aucun d'entre eux ouvert ou recv, et il est classe parente de Socket n'implemente pas ces méthodes non plus. Et la classe parente Socket semble être l'objet ? Je suis confus throughly)
La solution
Vous pouvez régler la réception des options de socket de délai d'attente sur la prise à autre chose que la valeur par défaut. Le peu difficile est de choisir un nombre approprié qui fonctionne encore dans tous les cas d'utilisation, à savoir que vous ne voulez pas que votre appel recv
à délai d'attente trop tôt.
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)