IO select. Reconnect procedure

Hey, I have a minor problem with my IRC bot. It disconnects every while
and then, often with a few days in between. My problem lies in the
reconnecting procedure. The bot does not notice when it has been
disconnected. I have tried Socket.closed?, time-out timer for the select
IO. Nothing seems to work.

Any idea why?

//Walle

[/code]
def loop()
while !@connection.closed?
ready = select([@connection, $stdin], nil, nil, 10)
next if !ready
ready[0].each do |message|
if(message == $stdin)
return if $stdin.eof
message = $stdin.gets
send(message)
elsif(message == @connection)
return if @connection.eof
message = @connection.gets
data_response(message.strip)
end
end
end
raise Errno::EPIPE
end
[/code]

Maybe this will help.

class TCPSocket
def off?
begin
eof
rescue
Kernel.puts “#{FILE}:#{LINE} #{$!.inspect}”
true
end
end
end

def loop
until connection.off?

end
end

Walle W. wrote:

Hey, I have a minor problem with my IRC bot. It disconnects every while
and then, often with a few days in between. My problem lies in the
reconnecting procedure. The bot does not notice when it has been
disconnected. I have tried Socket.closed?, time-out timer for the select
IO. Nothing seems to work.

Any idea why?

Maybe you have to detect when it sends you an empty string? (that
usually means the socket has closed). If it’s a bug report it though.
-rp

I will give it a go

thanks

Walle W. wrote:

It still happens, but very rarely… The bot kicks in again if I write
anything in the window($stdin).
Does anyone have any thoughts on this?

Yeah I think it’s a generic “problem” of TCP. If the other side has
closed the socket (or died, or been rebooted), and you never write
anything to the socket, you will never learn it is closed until the next
time you write something.

http://en.wikibooks.org/wiki/Ruby_Programming/Reference/Objects/Socket#keepalive

It still happens, but very rarely… The bot kicks in again if I write
anything in the window($stdin).
Does anyone have any thoughts on this?

//Walle

Roger P. wrote:

Walle W. wrote:

It still happens, but very rarely… The bot kicks in again if I write
anything in the window($stdin).
Does anyone have any thoughts on this?

Yeah I think it’s a generic “problem” of TCP. If the other side has
closed the socket (or died, or been rebooted), and you never write
anything to the socket, you will never learn it is closed until the next
time you write something.

Ruby Programming/Reference/Objects/Socket - Wikibooks, open books for an open world

Oh, okey.
Thank you for the insight.

//Walle