2009-04-30 13 views
10

Come posso rilevare che un socket è semiaperto? Il caso che ho a che fare è quando l'altro lato di un socket ha inviato una FIN e l'app Ruby ha ACKed quella FIN. C'è un modo per me di dire che la presa è in questa condizione?Ruby: Come rilevare quando un lato di una presa è stato chiuso

Prendiamo, per esempio:

require 'socket' 

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

loop do 
    c = s.accept 

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

In questo caso, quando telnet alla porta 5010, ci vediamo tutti il ​​mio ingresso fino a quando chiudo la sessione telnet. A quel punto, stamperà le stringhe vuote più e più velocemente possibile.

+1

Questo sembra essere un duplicato di http://stackoverflow.com/questions/61675/recovering-from-a-broken-tcp-socket-in-ruby-when-in-gets, non è sicuro se aiuta qualsiasi tho! – gaqzi

+0

Hai trovato una soluzione? –

+0

Haivng lo stesso problema. hai una soluzione? –

risposta

1

Si sta utilizzando la chiamata di blocco recv, che restituirà zero quando l'altra estremità si chiude. La presa non sarà chiusa finché non la chiuderai. Cambiare

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

a

while (s = c.recv(1024)) && s > 0 
    p s 
end 
c.close 
Problemi correlati