[ruby-list:48825] TCPSocket eof? and read

From: Nobuhiro IMAI <nov@...>
Date: 2012-07-10 03:29:01 UTC
List: ruby-list #48825
いまいです。

以下のようにすると、たまに以下のような結果になるのですが、sysread だけ
じゃなく、read と eof? を混ぜるのもまずいんでしょうか?

ruby 2.0.0dev (2012-07-10 trunk 36352) [x86_64-linux]

require "socket"

s = TCPServer.new("localhost", 0)
Thread.new do
  c = s.accept
  c.write("123456")
  # c.write("123")
  # c.write("456")
  c.close
end
addr = s.addr
c = TCPSocket.new(addr[3], addr[1])
Thread.new(c, &:eof?)
c.read(3) # => nil
c.read(3) # => "123"

サーバ側で "123" と "456" で 2 回 wirte すると、末尾の2行は

["123", "456"]
[nil, "123"]
["456", "123"]
["456", nil]
[nil, nil]

という組み合わせのいずれかになります。

ソケットが切断されたらすぐに再接続の処理を始めるという挙動を実現するの
に、eof? でブロックしておいて true が返るか IOError になるのを待つとい
うことをしようとしているのですが、何か他にいい方法はあるでしょうか?
--
Nobuhiro IMAI <nov@yo.rim.or.jp>
Key fingerprint = E57F 2482 4074 13BC 3B9A  165B C689 5B16 A620 4657

In This Thread

Prev Next