2010-02-01 20 views
0

Donc, j'ai le code suivant:Ruby TCPSocket recv blocage et ne jamais revenir

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 

fin

Ce qui fonctionne très bien, normalement. Le serveur auquel je parle retourne la réponse assez rapidement, généralement, et tout va bien.

Alors, aujourd'hui, quelque chose s'est mal passé avec le serveur. Pas mon problème, MAIS, cela a entraîné la suspension de toute mon application, en attente de délai de récupération. Ce n'est pas exactement optimal.

Existe-t-il un moyen de temporiser recv si je n'entends pas quelque chose de retour immédiatement? J'ai essayé de regarder la documentation de ruby, mais cela me désoriente vraiment (ie TCPSocket implémente seulement trois méthodes, aucune d'elles ouverte ou recv, et sa classe parente de Socket n'implémente pas non plus ces méthodes. ? Je suis complètement confus)

Répondre

2

Vous pouvez définir les options de socket de délai d'attente de réception sur le socket à autre chose que la valeur par défaut. Le point délicat est de choisir un nombre approprié qui fonctionne toujours dans tous les cas d'utilisation, c'est-à-dire que vous ne voulez pas que votre appel recv expire trop tôt.

s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)