From: Joseph McDonald Date: 2001-06-22T12:12:33+09:00 Subject: [ruby-talk:16739] Re: socket bug Thursday, June 21, 2001, 7:41:05 PM, you wrote: DT> You're running out of FD's in the server process. You need to close the DT> new socket in the parent after you fork: DT> s = TCPServer.new("0.0.0.0",6666) DT> while(new_sock = s.accept) DT> pid = fork DT> if(pid == nil) DT> line = new_sock.gets DT> new_sock.print("got #{line}\n") DT> new_sock.shutdown DT> exit DT> end DT> new_sock.close #<<<<<<<<<<<<<< DT> end DT> s.close Thanks Dave! I added that and also added a close to the client side, but I still get this error: server: ./socketbug.rb:6:in `wait': No child processes (Errno::ECHILD) from ./socketbug.rb:6 from ./socketbug.rb:5:in `call' from ./socketbug.rb:11 It seems to happen randomly, but maybe every 500 or so requests? Any idea what causes it? And then the client: It seems to really slow down from time to time (it could be the server that is hanging of course...) The hang time is sometimes up to 10 seconds between requests. I also get the: ./client.rb:7:in `open': No buffer space available - "socket(2)" (Errno::ENOBUFS) which I don't understand, is "w1" still hanging around after the close? Here is the new client code. As you can see, I just added the w1.close require 'socket' 1.upto(100000) do |x| puts x w1 = TCPsocket.open("127.0.0.1", 6666) w1.print "hello server\n" ans1 = w1.readlines.to_s w1.shutdown ### IS THIS NECESSARY? w1.close end I haven't seen any more segfaults out of it though, which is a GOOD THING. thanks, -joe