2009-04-30 4 views
10

Comment puis-je détecter qu'une socket est à moitié ouverte? Le cas que je traite est quand l'autre côté d'une socket a envoyé un FIN et l'application Ruby a ACKed ce FIN. Y at-il un moyen pour moi de dire que la prise est dans cet état?Ruby: Comment détecter quand un côté d'un socket a été fermé

Prenez, par exemple:

require 'socket' 

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

loop do 
    c = s.accept 

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

Dans ce cas, quand je telnet dans le port 5010, je vais voir toutes mes entrées jusqu'à ce que je ferme la session telnet. À ce stade, il imprimera les chaînes vides encore et encore aussi vite que possible.

+1

Cela semble être un double de http://stackoverflow.com/questions/61675/recovering-from-a-broken-tcp-socket-in-ruby-when-in-gets, pas sûr que cela aide tout tho! – gaqzi

+0

Avez-vous trouvé une solution? –

+0

Haivng le même problème. Avez-vous une solution? –

Répondre

1

Vous utilisez l'appel bloquant recv, qui retournera zéro lorsque l'autre extrémité se ferme. Le socket ne sera pas fermé jusqu'à ce que vous le fermiez. Changer

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

à

while (s = c.recv(1024)) && s > 0 
    p s 
end 
c.close 
Questions connexes