# Problems with TCPSocket

**URL:** <https://www.ruby-forum.com/t/problems-with-tcpsocket/225978>\
**Category:** Ruby\
**Created:** [November 21, 2007, 5:35am UTC](https://www.ruby-forum.com/t/problems-with-tcpsocket/225978 "2007-11-21T05:35:56Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![cacciatc](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/da6949/32.png) [@cacciatc](https://www.ruby-forum.com/u/cacciatc)\
**Post date:** [November 21, 2007, 5:35am UTC](https://www.ruby-forum.com/t/problems-with-tcpsocket/225978/1 "2007-11-21T05:35:56Z")

</div>

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§  
@t = TCPServer.new§  
@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
