Ruby TCPSocket Recv bloqueando e nunca retornando
-
24-09-2019 - |
Pergunta
Então, eu tenho o seguinte código:
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
fim
O que funciona bem, normalmente. O servidor com o qual estou conversando retorna a resposta rapidamente, geralmente, e tudo está bem.
Então, hoje, algo deu errado com o servidor. Não é o meu problema, mas isso resultou em todo o meu aplicativo pendurado, aguardando o RECV no tempo. Isso não é exatamente ideal.
Existe uma maneira de fazer o tempo de recv se eu não ouvir algo de volta imediatamente? Tentei olhar para a documentação do Ruby, mas isso realmente me confunde (ou seja, o TCPSocket implementa apenas três métodos, nenhum deles se abre ou RECV, e sua classe de soquete dos pais também não implementa esses métodos. E a classe pai do soquete parece ser objeto ? Estou completamente confuso)
Solução
Você pode definir as opções de soquete de tempo limite de receber no soquete para outra coisa que o padrão. A parte complicada é escolher um número adequado que ainda funcione em todos os casos de uso, ou seja, você não quer o seu recv
Ligue para o tempo limite muito cedo.
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, <timeout>)