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)

Foi útil?

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>)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top