man-1.1b8 の socket のサンプルなのですが。

read メソッドを使っている場合、データが渡りません。sync すれ
ばいいのかな? と思ったのですが、そうでもないようです。read の
代わりに gets すると動作します。

サンプルとして、TCPsocket と TCPserver(スレッドではない方) の
二つになります。

確認は Linux kernel 2.0.33 と HP-UX 10.20 で行ったのですが、
すぐ使えるように read ではなく gets を使って書いてあった方が
いいのではないでしょうか?

ということで、次のような感じにしてはいかがでしょうか?

TCPserver
------------------------------
require "socket"

gs = TCPserver.open(0)
socks = [gs]
addr = gs.addr
addr.shift
printf("server is on %d\n", addr.join(":"))

while TRUE
  nsock = select(socks)
  next if nsock == nil
  for s in nsock[0]
    if s == gs
      socks.push(s.accept)
      print(s, " is accepted\n")
    else
      if s.eof?
	print(s, " is gone\n")
	s.close
	socks.delete(s)
      else
	str = s.gets
	s.write(str)
      end
    end
  end
end
------------------------------

TCPclient
------------------------------
require "socket"

port = if ARGV.size > 0 then ARGV.shift else 4444 end
print port, "\n"

s = TCPsocket.open("localhost", port)

while gets
  s.write($_)
  print(s.gets)
end

s.close

exit
------------------------------

ほんとは read 使っても動くんでしょうか? sync は書き込み時なの
で readline か gets を使うと思われるのですが。いかがでしょう?

--
WATANABE Tetsuya HP Japan PSO
e-mail  tetsu / jpn.hp.com