[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

problems with TCPSocket

cacciatc

11/21/2007 4:31:00 AM

I am trying out a little code for a client/server and I was testing to
see how many simultaneous clients the server
could handle, but I always get a "Bad file descriptor - connect(2)"
error message, exactly after the sixth client connects. I have tried
it with my firewall disabled and I'm testing it on laptop that runs
Win XP. Any help would be much appreciated.

cacciatc

Here are my client and server:

class Client
def initialize(addr,p)
begin
@t = TCPSocket.new(addr,p)
print "connecting to " + addr.to_s + " on port " + p.to_s +
"..."
rescue
puts "error: #{$!}"
else
puts "connected"
end
end #end init

def safe_gets
begin
output = @t.gets
rescue
puts "error: #{$!}"
tear_down
else
return output
end
end #end safe gets

def safe_write(sock,msg)
begin
sock.write(msg)
rescue
@desc.delete(sock)
sock.close
end
end

def get_login
out1 = safe_gets
out2 = safe_gets
print out1.chomp
@name = gets
print out2.chomp
@passwd = gets
end #end get login

def connect
safe_write(@t,@name.chomp + " " + @passwd)
out = safe_gets
out
end #end connect

def run
get_login
if connect != "Welcome\n" then
puts "incorrect name or passwd"
get_login
if connect != "Welcome\n" then
tear_down
end
end
#processing loop
while 1
# puts @t.gets
print ">> "
input = gets
safe_write(@t,input)
if input.downcase == "q\n" then
tear_down
end
out = safe_gets
puts out
end
tear_down
end #end run

def tear_down
@t.close
exit
end # end tear down

end #end Client

c = Array.new(25)
cnt = 0
while cnt < 25
c.push(Client.new("localhost",10001))
i = 0
while i < 1000000
i+=1
end
cnt += 1
end
c.each {|cl| cl.run}
c.each {|cl| cl.tear_down}


class Logind
def initialize(p)
@t = TCPServer.new(p)
@t.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR,1)
@desc = Array.new
@gdesc = Hash.new
@desc.push(@t)
end

def accept_new_connection
begin
newsock = @t.accept
rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EINTR
IO.select[@t]
retry
end
newsock.write("username: \npasswd: \n")
begin
input = safe_gets(newsock)
rescue
#log bad socket
puts newsock
newsock.close
else
safe_write(newsock,"Welcome\n")
@desc.push(newsock)
end
end #end accept_new_connection

def run
while true
res = select(@desc,nil,nil,nil)
if res != nil then
for sock in res[0]
if sock == @t then
accept_new_connection
else
if sock.eof? then
sock.close
@desc.delete(sock)
else
input = safe_gets(sock)
end
end
end #end for
end #end select test
end #end while
end # end run

def safe_gets(sock)
ret_cnt = 0
begin
out = sock.gets
rescue
if ret_cnt < 5 then
ret_cnt+=1
retry
end
else
return out
end
end

def safe_write(sock,msg)
ret_cnt = 0
begin
sock.write(msg)
rescue
if ret_cnt < 5 then
ret_cnt+=1
retry
end
end
end

end #end logind

l = Logind.new(10001)
l.run
1 Answer

Pangkor

2/14/2012 7:01:00 PM

0

On Feb 12, 7:12 pm, Pelandok <Daqta...@yahoo.com> wrote:
> On Feb 12, 7:07 pm, Pelandok <Daqta...@yahoo.com> wrote:
>
> > On Feb 12, 1:48 pm, "AleXX®" <cir...@cycle.net> wrote:
>
> > >http://calgary.ctv.ca/servlet/an/local/CTVNews/20120211/whi.......
>
> > "Some US city and municipal water facilities (Orange County, CA) are
> > already providing RO treated water to their communities. Los Angeles
> > county is also considering RO systems as we speak. Even B'verly Hills
> > 90210 is using RO water. Hey if reverse osmosis is good enough for the
> > OC and the Hollywood elite that must tell you something!"
>
> >http://www.squidoo.com/reverse-osmosis-water-...
>
> Sorry, forgot the quotation " " symbols.

From the further news, it doesn't look like our type of exercise
deaths, and Beverly Hills is not in Orange County, so no recycled
water, anyway.

Perhaps she fainted due to the alcohol and prescription drug mix, and
became submerged, thereby cutting off the oxygen supply.