From: Raj Sahae Date: 2007-02-13T17:37:50+09:00 Subject: hanging in a client server threaded program I was having a buffered IO problem which I solved using IO.ready?, but now I'm hanging. What's interesting is that I wrote a little test program to demonstrate the problem, and it doesn't cause the server to hang, but the larger program does. The object that communicates with the server is exactly the same in both programs, except for some trivialites that I had to change in order to make the program work standalone. I use threads in the test program because the main program uses them and if that is the problem I was hoping it would show up. The server is hanging right after the "socket recieved" output in the accept_new_connection method. ################## Test Reciever ############### class Reciever def initialize @target = Target.new @target.socket = TCPSocket.new('127.0.0.1', 7824) puts "Socket Opened" @target.socket.write("name") end def run while 1 if @target.socket.ready? print "message recieved\n" if @target.socket.eof? @target.socket.close raise :ServerClosedConnection else puts "Entered else" message = @target.socket.read @target.parse_and_execute(message) end end end end end class Target attr_accessor :socket def initialize @socket end def parse_and_execute(message) puts message end end thr = Array.new thr << Thread.new do Reciever.new.run end thr << Thread.new do sleep() end thr.each {|thread| thread.join} ################## Actual Reciever, This one causes the server to hang ####### class Reciever def initialize(target) ip_address = nil target.socket = TCPSocket.new(ip_address, $port) puts "Socket Opened" name = target.me.name puts "Name is " + target.me.name.to_s target.socket.write("Raj") puts "Name sent" end def run(target) while 1 if target.socket.ready? print "message recieved\n" if target.socket.eof? target.socket.close raise :ServerClosedConnection else message = target.socket.read target.parse_and_execute(message) end end end end end ################## Server ################### class Interlink attr_accessor :descriptors def initialize(server) @descriptors = Array.new @server = server @serverSocket = server.socket = TCPServer.new('localhost', $port) @serverSocket.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1) @descriptors << @serverSocket end def run while 1 res = select(@descriptors, nil, nil, nil) unless res.nil? res[0].each do |sock| if sock == @serverSocket accept_new_connection else if sock.eof? puts "Socket #{sock} disconnected." sock.close else #broadcast(sock.gets, sock) end end end end end end def accept_new_connection newsock = @serverSocket.accept print "Socket accepted\n" name = newsock.recv(20) #####THE SERVER IS HANGING HERE####### print "name recieved\n" print "name is #{name}\n" @server.add_player(name, newsock) print "player added\n" @descriptors << newsock newsock.write("test target data") #newsock.write("info You connected to the STCCG GameServer.\n") #broadcast("info #{name} joined the game.\n", newsock) end def broadcast(str, omit_sock) @descriptors.each do |socket| if socket != @serverSocket and socket != omit_sock socket.write(str) end end end end -- Posted via http://www.ruby-forum.com/.