2009-04-30 7 views
10

¿Cómo puedo detectar que un socket esté medio abierto? El caso con el que estoy tratando es cuando el otro lado de un socket ha enviado un FIN y la aplicación Ruby ha ACKed ese FIN. ¿Hay alguna manera de decir que el socket está en esta condición?Ruby: cómo detectar cuándo se ha cerrado un lado de un socket

Tomemos, por ejemplo:

require 'socket' 

s = TCPServer.new('0.0.0.0', 5010) 

loop do 
    c = s.accept 

    until c.closed? 
    p c.recv(1024) 
    end 
end 

En este caso, cuando el telnet al puerto 5010, voy a ver todo mi entrada hasta que cierro la sesión de telnet. En ese punto, imprimirá cadenas vacías una y otra vez tan rápido como sea posible.

+1

Esto parece ser un duplicado de http://stackoverflow.com/questions/61675/recovering-from-a-broken-tcp-socket-in-ruby-when-in-gets, no estoy seguro si sirve de algo aunque! – gaqzi

+0

¿Has encontrado una solución? –

+0

teniendo el mismo problema. tienes una solución? –

Respuesta

1

Está utilizando la llamada de bloqueo recv, que devolverá nil cuando se cierre el otro extremo. La toma no se cerrará hasta que la cierre. Cambiar

until c.closed? 
    p c.recv(1024) 
    end 

a

while (s = c.recv(1024)) && s > 0 
    p s 
end 
c.close 
Cuestiones relacionadas