From: Peter Yu Date: 2001-01-01T16:40:02+09:00 Subject: [ruby-talk:8455] Proper Usage of recv(from)? After poking around the documentation a bit, I managed to do a little test server program. However, I've run into a little problem: I wanted to keep all the connections within the same thread and simply use select() and loops to service all the various connections; however, the sample server's socket.gets will block the thread until after it finds a newline. So, I tried using socket.recv(), and it complains about "recv for buffered IO (IOError)" Socket.gets() did finally work, but it does seem rather inefficient to read/echo one single character at a time... Anyone know what I'm doing wrong? The stuff below is the test program. Thanks in advance, Peter Yu require "socket" class DUCKSOCK @@connections = [] @@handle = nil def initialize(port) @@handle = TCPServer.open(port) @@connections = [@@handle] end def poll(pause) sock = select(@@connections, nil, nil, pause) return if sock == nil for s in sock[0] if (s == @@handle) conn = s.accept @@connections.push(conn) printf ("Connection from %s(%s) on port %s\n", conn.addr[2], conn.addr[3], conn.addr[1]) else if s.eof? printf("Connection from %s(%s) on port %s lost\n", s.addr[2], s.addr[3], s.addr[1]) s.close @@connections.delete(s) else #str = s.gets #This'll block until a newline... str=s.recvfrom(100)[0]#Complains about "recv for buffered IO" #char = s.getc #Works, but exceedingly slow. s.write(str) end end end end end ds = DUCKSOCK.new(2000) diff = 0 while true time1 = Time.new ds.poll(2.0+diff) time2 = Time.new elapsed = (time2.to_f-time1.to_f) diff = 2.0 - elapsed while (diff < -2.0) diff += 2.0 printf("Extra!\n"); end print "Elaspsed %10.20f\n" % elapsed print time2, "\n" end Sent via Deja.com http://www.deja.com/